output files::
>>> parser = argparse.ArgumentParser()
- >>> parser.add_argument('infile', nargs='?', type=argparse.FileType('r'),
- ... default=sys.stdin)
- >>> parser.add_argument('outfile', nargs='?', type=argparse.FileType('w'),
- ... default=sys.stdout)
+ >>> parser.add_argument('infile', nargs='?')
+ >>> parser.add_argument('outfile', nargs='?')
>>> parser.parse_args(['input.txt', 'output.txt'])
- Namespace(infile=<_io.TextIOWrapper name='input.txt' encoding='UTF-8'>,
- outfile=<_io.TextIOWrapper name='output.txt' encoding='UTF-8'>)
+ Namespace(infile='input.txt', outfile='output.txt')
+ >>> parser.parse_args(['input.txt'])
+ Namespace(infile='input.txt', outfile=None)
>>> parser.parse_args([])
- Namespace(infile=<_io.TextIOWrapper name='<stdin>' encoding='UTF-8'>,
- outfile=<_io.TextIOWrapper name='<stdout>' encoding='UTF-8'>)
+ Namespace(infile=None, outfile=None)
.. index:: single: * (asterisk); in argparse module
parser.add_argument('distance', type=float)
parser.add_argument('street', type=ascii)
parser.add_argument('code_point', type=ord)
- parser.add_argument('dest_file', type=argparse.FileType('w', encoding='latin-1'))
parser.add_argument('datapath', type=pathlib.Path)
User defined functions can be used as well:
>>> parser.parse_args(['-'])
Namespace(infile=<_io.TextIOWrapper name='<stdin>' encoding='UTF-8'>)
+ .. note::
+
+ If one argument uses *FileType* and then a subsequent argument fails,
+ an error is reported but the file is not automatically closed.
+ This can also clobber the output files.
+ In this case, it would be better to wait until after the parser has
+ run and then use the :keyword:`with`-statement to manage the files.
+
.. versionchanged:: 3.4
Added the *encodings* and *errors* parameters.
+ .. deprecated:: 3.14
+
Argument groups
^^^^^^^^^^^^^^^
'integers', metavar='int', nargs='+', type=int,
help='an integer to be summed')
parser.add_argument(
- '--log', default=sys.stdout, type=argparse.FileType('w'),
+ '--log',
help='the file where the sum should be written')
args = parser.parse_args()
- args.log.write('%s' % sum(args.integers))
- args.log.close()
+ with (open(args.log, 'w') if args.log is not None
+ else contextlib.nullcontext(sys.stdout)) as log:
+ log.write('%s' % sum(args.integers))
The module contains the following public classes:
- FileType -- A factory for defining types of files to be created. As the
example above shows, instances of FileType are typically passed as
- the type= argument of add_argument() calls.
+ the type= argument of add_argument() calls. Deprecated since
+ Python 3.14.
- Action -- The base class for parser actions. Typically actions are
selected by passing strings like 'store_true' or 'append_const' to
# ==============
class FileType(object):
- """Factory for creating file object types
+ """Deprecated factory for creating file object types
Instances of FileType are typically passed as type= arguments to the
ArgumentParser add_argument() method.
"""
def __init__(self, mode='r', bufsize=-1, encoding=None, errors=None):
+ import warnings
+ warnings.warn(
+ "FileType is deprecated. Simply open files after parsing arguments.",
+ category=PendingDeprecationWarning,
+ stacklevel=2
+ )
self._mode = mode
self._bufsize = bufsize
self._encoding = encoding
# Type conversion tests
# =====================
+def FileType(*args, **kwargs):
+ with warnings.catch_warnings():
+ warnings.filterwarnings('ignore', 'FileType is deprecated',
+ PendingDeprecationWarning, __name__)
+ return argparse.FileType(*args, **kwargs)
+
+
+class TestFileTypeDeprecation(TestCase):
+
+ def test(self):
+ with self.assertWarns(PendingDeprecationWarning) as cm:
+ argparse.FileType()
+ self.assertIn('FileType is deprecated', str(cm.warning))
+ self.assertEqual(cm.filename, __file__)
+
+
class TestFileTypeRepr(TestCase):
def test_r(self):
- type = argparse.FileType('r')
+ type = FileType('r')
self.assertEqual("FileType('r')", repr(type))
def test_wb_1(self):
- type = argparse.FileType('wb', 1)
+ type = FileType('wb', 1)
self.assertEqual("FileType('wb', 1)", repr(type))
def test_r_latin(self):
- type = argparse.FileType('r', encoding='latin_1')
+ type = FileType('r', encoding='latin_1')
self.assertEqual("FileType('r', encoding='latin_1')", repr(type))
def test_w_big5_ignore(self):
- type = argparse.FileType('w', encoding='big5', errors='ignore')
+ type = FileType('w', encoding='big5', errors='ignore')
self.assertEqual("FileType('w', encoding='big5', errors='ignore')",
repr(type))
def test_r_1_replace(self):
- type = argparse.FileType('r', 1, errors='replace')
+ type = FileType('r', 1, errors='replace')
self.assertEqual("FileType('r', 1, errors='replace')", repr(type))
text = text.decode('ascii')
return self.name == other.name == text
-
class TestFileTypeR(TempDirMixin, ParserTestCase):
"""Test the FileType option/argument type for reading files"""
self.create_readonly_file('readonly')
argument_signatures = [
- Sig('-x', type=argparse.FileType()),
- Sig('spam', type=argparse.FileType('r')),
+ Sig('-x', type=FileType()),
+ Sig('spam', type=FileType('r')),
]
failures = ['-x', '', 'non-existent-file.txt']
successes = [
file.close()
argument_signatures = [
- Sig('-c', type=argparse.FileType('r'), default='no-file.txt'),
+ Sig('-c', type=FileType('r'), default='no-file.txt'),
]
# should provoke no such file error
failures = ['']
file.write(file_name)
argument_signatures = [
- Sig('-x', type=argparse.FileType('rb')),
- Sig('spam', type=argparse.FileType('rb')),
+ Sig('-x', type=FileType('rb')),
+ Sig('spam', type=FileType('rb')),
]
failures = ['-x', '']
successes = [
self.create_writable_file('writable')
argument_signatures = [
- Sig('-x', type=argparse.FileType('w')),
- Sig('spam', type=argparse.FileType('w')),
+ Sig('-x', type=FileType('w')),
+ Sig('spam', type=FileType('w')),
]
failures = ['-x', '', 'readonly']
successes = [
self.create_writable_file('writable')
argument_signatures = [
- Sig('-x', type=argparse.FileType('x')),
- Sig('spam', type=argparse.FileType('x')),
+ Sig('-x', type=FileType('x')),
+ Sig('spam', type=FileType('x')),
]
failures = ['-x', '', 'readonly', 'writable']
successes = [
"""Test the FileType option/argument type for writing binary files"""
argument_signatures = [
- Sig('-x', type=argparse.FileType('wb')),
- Sig('spam', type=argparse.FileType('wb')),
+ Sig('-x', type=FileType('wb')),
+ Sig('spam', type=FileType('wb')),
]
failures = ['-x', '']
successes = [
"Test the FileType option/argument type for writing new binary files only"
argument_signatures = [
- Sig('-x', type=argparse.FileType('xb')),
- Sig('spam', type=argparse.FileType('xb')),
+ Sig('-x', type=FileType('xb')),
+ Sig('spam', type=FileType('xb')),
]
successes = [
('-x foo bar', NS(x=WFile('foo'), spam=WFile('bar'))),
"""Test that open (the builtin) is correctly called"""
def test_open_args(self):
- FT = argparse.FileType
+ FT = FileType
cases = [
(FT('rb'), ('rb', -1, None, None)),
(FT('w', 1), ('w', 1, None, None)),
def test_invalid_file_type(self):
with self.assertRaises(ValueError):
- argparse.FileType('b')('-test')
+ FileType('b')('-test')
class TestFileTypeMissingInitialization(TestCase):