在Python的argparse模块中,nargs=1有什么使用场景?

18
似乎总是更明智地使用默认操作store而不指定nargs,这样输出总是如预期的一样,而不是有时为list,有时则不是。我只是好奇是否错过了什么..
例子:
>>> import argparse                                                                                                                     
>>> parser = argparse.ArgumentParser()                                                                                                  
>>> parser.add_argument('--foo')                                                                                                        
_StoreAction(option_strings=['--foo'], dest='foo', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None)                                                                                                                                      
>>> parser.add_argument('--bar', nargs=1)                                                                                               
_StoreAction(option_strings=['--bar'], dest='bar', nargs=1, const=None, default=None, type=None, choices=None, help=None, metavar=None)
>>> parser.parse_args('--foo 1 --bar 1'.split())                                                                                        
Namespace(bar=['1'], foo='1')                                                                                                           
>>> parser.parse_args('')                                                                                                               
Namespace(bar=None, foo=None)                                                                                                           

也许,如果您想通过将所有参数转换为列表来通用地处理它们? - gaborous
只有当它是“None”时,它才不是列表。如果您希望您的参数是列表,则使用“nargs = 1”是有意义的。 - Brendan Abel
嗯,但是如果你将其与nargs='*'进行对比,后者总是返回一个列表,而nargs=1似乎需要额外的工作来管理。 - penchant
@tr3buchet nargs='*' 可以接受多个值,因此如果您只期望此参数的一个值,则必须自行进行检查,而 nargs=1 确保您仅获得一个值,但仍将其存储在列表中。 - gaborous
жҲ‘е®Ңе…ЁзҗҶи§Ј'*'е’Ң1д№Ӣй—ҙзҡ„еҢәеҲ«пјҢдҪҶжҲ‘дёҚжҳҺзҷҪдёәд»Җд№ҲдҪ жғіиҰҒnargs=1иҝ”еӣһдёҖдёӘеҢ…еҗ«дёҖдёӘе…ғзҙ жҲ–иҖ…Noneзҡ„еҲ—иЎЁгҖӮ - penchant
通常情况下,我会尽量确保返回复数的函数始终返回可迭代对象,因为这样更容易消费,正如我在下面评论@hpaulj的回答中所述。 - penchant
2个回答

24
默认情况下,nargs=Nonenargs=1 都期望一个值,但是 nargs=1 会将其放入列表中,例如:
Namespace(foo='test')
Namespace(foo=['test'])

nargs=3需要三个值,并将它们放入列表中。 *+也会将值放入列表中。

从文档中,nargs=Nhttps://docs.python.org/3/library/argparse.html#nargs

请注意,nargs = 1会生成一个项目列表。 这与默认设置不同,其中该项目是单独生成的。

nargs=1只是nargs=n的一个实例。 它不是特殊情况。

对于您作为argparse用户,您可能不需要使用1。 实际上,对我来说,这是一个新手的标志 - 除非在输出中明确需要列表。 我可以想象,例如,构建一个解析器,以编程方式将n设置为某个数字,可能是3,可能是5,可能是1,并期望结果始终是列表。


我已经仔细阅读了文档。我理解它的工作原理以及 *+?N 之间的区别。你在那里强调的注意事项是我要质疑的用例。我想我已经习惯了一个函数应该尽可能返回相同类型(listdictstr 等)。例如,一个总是返回 list 的函数比一个返回填充的 listNone 更容易使用,因为 None 会破坏任何期望可迭代的东西,这需要用户检查输出。 - penchant
我可以想象,例如构建一个解析器,以编程方式将n设置为某个数字,可能是3,可能是5,可能是1,并期望结果始终是一个列表。好了!这就是我要找的。我还没有需要动态生成配置解析器,这非常合理。 - penchant
返回 None 是很方便的,因为用户无法输入任何内容来产生它。因此,if args.foo is None: 是一种绝对可靠的测试方式,用于检测用户是否使用了 --foo 标志。在任何情况下,选择最方便的方式来简化生活。 - hpaulj

1
对我而言,nargs=1的优点在于可以与“append”操作一起使用,这样,如果我想使用该选项一次,我将获得一个包含一个项目的列表,如果我使用两次,则会获得一个包含两个项目的列表,以此类推。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接