2024-04-19 00:41:36 发布
网友
有没有比传递给argparse的可选整数列表更优雅的方法呢?我还有一个立场上的论点。在
argparse
parser.add_argument('--ids', type=int, nargs='+') parser.add_argument('cmd')
不起作用,因为argparse试图获取cmd,并抱怨它不是整数。在
cmd
理想情况下,我想用
或者类似的东西,但也能
program.py refresh
如果您只想分析 ids 1,2,3(没有空格)形式的参数,可以使用如下方法:
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会将它们作为单独的参数传递。在
convert()
是表示“位置参数从这里开始”的便捷方式。在
通过您的解析器,这些功能可以:
program.py refresh # sets ids=None program.py refresh ids 1 2 3 program.py ids 1 2 3 refresh
如果您不喜欢None,可以给 ids参数一个默认值(例如.[])。在
None
ids
program.py refesh ids 1,2,3的任何问题都是由于shell如何拆分命令行造成的。查看sys.argv列表。在
program.py refesh ids 1,2,3
sys.argv
出现program.py ids 1 2 3 refresh的问题是因为在处理 ids时,解析器试图使用后面没有明显标志的所有字符串(例如用“-”)。它不使用'int'类型来测试要使用哪些和离开哪些。在
program.py ids 1 2 3 refresh
现在,如果ids是位置的,它将处理1 2 3 refresh:
1 2 3 refresh
但这是因为解析器使用不同的策略将字符串分配给多个位置参数。它使用一个re匹配器,它看起来像A+A。在
re
A+A
Kevin的type方法可以用一个简单的函数更好地实现:
type
def mytype(astring): ll = astring.split(',') return [int(l) for l in ll] parser.add_argument(' ids', type=mytype)
它可以被泛化为处理像“1233”这样的带引号的字符串。type可以是任何接受字符串并返回所需值的函数,如果无法进行转换,则会引发错误。在
如果您只想分析
ids 1,2,3
(没有空格)形式的参数,可以使用如下方法:这将不会处理由空格分隔的参数,尽管您可以使用更聪明的
convert()
函数来减轻这种情况。但是,您需要引用它们,否则shell会将它们作为单独的参数传递。在是表示“位置参数从这里开始”的便捷方式。在
通过您的解析器,这些功能可以:
如果您不喜欢
None
,可以给ids
参数一个默认值(例如.[])。在program.py refesh ids 1,2,3
的任何问题都是由于shell如何拆分命令行造成的。查看sys.argv
列表。在出现
program.py ids 1 2 3 refresh
的问题是因为在处理ids
时,解析器试图使用后面没有明显标志的所有字符串(例如用“-”)。它不使用'int'类型来测试要使用哪些和离开哪些。在现在,如果
^{pr2}$ids
是位置的,它将处理1 2 3 refresh
:但这是因为解析器使用不同的策略将字符串分配给多个位置参数。它使用一个
re
匹配器,它看起来像A+A
。在Kevin的
type
方法可以用一个简单的函数更好地实现:它可以被泛化为处理像“1233”这样的带引号的字符串。
type
可以是任何接受字符串并返回所需值的函数,如果无法进行转换,则会引发错误。在相关问题 更多 >
编程相关推荐