将可选列表传递给argpars

2024-04-19 00:41:36 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有比传递给argparse的可选整数列表更优雅的方法呢?我还有一个立场上的论点。在

parser.add_argument('--ids', type=int, nargs='+')
parser.add_argument('cmd')

不起作用,因为argparse试图获取cmd,并抱怨它不是整数。在

理想情况下,我想用

^{pr2}$

或者类似的东西,但也能

program.py refresh

Tags: 方法cmdaddidsparser列表typeargparse
2条回答

如果您只想分析 ids 1,2,3(没有空格)形式的参数,可以使用如下方法:

def convert(argument):
    return map(int, argument.split(','))  # 3.x: consider wrapping in list()

parser.add_argument(' ids', type=convert)

这将不会处理由空格分隔的参数,尽管您可以使用更聪明的convert()函数来减轻这种情况。但是,您需要引用它们,否则shell会将它们作为单独的参数传递。在

是表示“位置参数从这里开始”的便捷方式。在

通过您的解析器,这些功能可以:

program.py refresh   # sets ids=None
program.py refresh  ids 1 2 3
program.py  ids 1 2 3   refresh

如果您不喜欢None,可以给 ids参数一个默认值(例如.[])。在

program.py refesh ids 1,2,3的任何问题都是由于shell如何拆分命令行造成的。查看sys.argv列表。在

出现program.py ids 1 2 3 refresh的问题是因为在处理 ids时,解析器试图使用后面没有明显标志的所有字符串(例如用“-”)。它不使用'int'类型来测试要使用哪些和离开哪些。在

现在,如果ids是位置的,它将处理1 2 3 refresh

^{pr2}$

但这是因为解析器使用不同的策略将字符串分配给多个位置参数。它使用一个re匹配器,它看起来像A+A。在


Kevin的type方法可以用一个简单的函数更好地实现:

def mytype(astring):
    ll = astring.split(',')
    return [int(l) for l in ll]
parser.add_argument(' ids', type=mytype)

它可以被泛化为处理像“1233”这样的带引号的字符串。type可以是任何接受字符串并返回所需值的函数,如果无法进行转换,则会引发错误。在

相关问题 更多 >