我正在尝试允许一个带有文件名的单个命令行参数的可选参数:
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一致地返回相同类型的结构(在列表中处理或不在列表中处理)?
答案 0 :(得分:1)
删除nargs
参数。
请注意
nargs=1
会生成一个项目的列表。这与默认情况不同,在默认情况下,项目由其自身生成。
对评论进行更新
删除
nargs=1
将消除指定filename参数的要求。
让我们检查:
>>> 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