mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	bpo-37150: Throw ValueError if FileType class object was passed in add_argument (GH-13805)
There is a possibility that someone (like me) accidentally will omit parentheses with `FileType` arguments after `FileType`, and parser will contain wrong file until someone will try to use it. 
Example:
```python
parser = argparse.ArgumentParser()
parser.add_argument('-x', type=argparse.FileType)
```
https://bugs.python.org/issue37150
			
			
This commit is contained in:
		
							parent
							
								
									1f9531764c
								
							
						
					
					
						commit
						03d5831a2d
					
				
					 3 changed files with 23 additions and 0 deletions
				
			
		|  | @ -1361,6 +1361,10 @@ def add_argument(self, *args, **kwargs): | ||||||
|         if not callable(type_func): |         if not callable(type_func): | ||||||
|             raise ValueError('%r is not callable' % (type_func,)) |             raise ValueError('%r is not callable' % (type_func,)) | ||||||
| 
 | 
 | ||||||
|  |         if type_func is FileType: | ||||||
|  |             raise ValueError('%r is a FileType class object, instance of it' | ||||||
|  |                              ' must be passed' % (type_func,)) | ||||||
|  | 
 | ||||||
|         # raise an error if the metavar does not match the type |         # raise an error if the metavar does not match the type | ||||||
|         if hasattr(self, "_get_formatter"): |         if hasattr(self, "_get_formatter"): | ||||||
|             try: |             try: | ||||||
|  |  | ||||||
|  | @ -1619,6 +1619,24 @@ def test_open_args(self): | ||||||
|                 m.assert_called_with('foo', *args) |                 m.assert_called_with('foo', *args) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | class TestFileTypeMissingInitialization(TestCase): | ||||||
|  |     """ | ||||||
|  |     Test that add_argument throws an error if FileType class | ||||||
|  |     object was passed instead of instance of FileType | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     def test(self): | ||||||
|  |         parser = argparse.ArgumentParser() | ||||||
|  |         with self.assertRaises(ValueError) as cm: | ||||||
|  |             parser.add_argument('-x', type=argparse.FileType) | ||||||
|  | 
 | ||||||
|  |         self.assertEqual( | ||||||
|  |             '%r is a FileType class object, instance of it must be passed' | ||||||
|  |             % (argparse.FileType,), | ||||||
|  |             str(cm.exception) | ||||||
|  |         ) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| class TestTypeCallable(ParserTestCase): | class TestTypeCallable(ParserTestCase): | ||||||
|     """Test some callables as option/argument types""" |     """Test some callables as option/argument types""" | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -0,0 +1 @@ | ||||||
|  | `argparse._ActionsContainer.add_argument` now throws error, if someone accidentally pass FileType class object instead of instance of FileType as `type` argument | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 zygocephalus
						zygocephalus