type=argparse.FileType 时如何指定 argparse 默认文件

How to specify argparse default file when type=argparse.FileType

我正在尝试允许一个可选参数,该参数采用文件名的单个命令行参数:

parser.add_argument('--somefile', nargs=1, type=argparse.FileType('r'),
                     required=False, default='defaultfile.json')

问题是当我使用 --somefile foo.json 指定文件时,我在列表中取回了一个句柄:

args.somefile=[<_io.TextIOWrapper name='foo.json' mode='r' encoding='UTF-8'>]

当我没有指定它并想要默认值时,我得到了一个句柄,但不在列表中:

args.somefile=<_io.TextIOWrapper name='defaultfile.json' mode='r' encoding='UTF-8'>

如何使 args.somefile 到 return 相同类型的结构(在列表中处理或不在列表中处理)一致?

删除 nargs 参数。

Note that nargs=1 produces a list of one item. This is different from the default, in which the item is produced by itself.

更新评论

Removing nargs=1 would eliminate the requirement to specify the filename argument.

让我们检查一下:

>>> import argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--somefile', type=argparse.FileType('r'), required=False, default='/tmp/data.json')
_StoreAction(option_strings=['--somefile'], dest='somefile', nargs=None, const=None, default='/tmp/data.json', type=FileType('r'), choices=None, help=None, metavar=None)
>>> args = parser.parse_args(['--somefile',])
usage: [-h] [--somefile SOMEFILE]
: error: argument --somefile: expected one argument