Python 将可选列表传递给argparse
是否有一种更优雅的方式将可选整数列表传递给Python 将可选列表传递给argparse,python,argparse,Python,Argparse,是否有一种更优雅的方式将可选整数列表传递给argparse而不是传递给?我还有一个位置论点 parser.add_argument('--ids', type=int, nargs='+') parser.add_argument('cmd') 不起作用,因为argparse尝试获取cmd,并抱怨它不是整数 理想情况下,我想与其中一个执行 program.py --ids 6,32,12 refresh program.py --ids 6 32 12 refresh 或者类似的东西,但也能
argparse
而不是传递给?我还有一个位置论点
parser.add_argument('--ids', type=int, nargs='+')
parser.add_argument('cmd')
不起作用,因为argparse
尝试获取cmd
,并抱怨它不是整数
理想情况下,我想与其中一个执行
program.py --ids 6,32,12 refresh
program.py --ids 6 32 12 refresh
或者类似的东西,但也能
program.py refresh
--
是一种表示“位置参数从这里开始”的简便方法
使用您的解析器,可以执行以下操作:
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”类型来测试使用哪一个和离开哪一个
现在,如果id
是定位的,那么它将处理123refresh
:
parser.add_argument('ids',type=int,nargs='+')
parser.add_argument('cmd')
parser.parse_args('1 2 3 refresh'.split())
但这是因为解析器使用不同的策略将字符串分配给几个位置参数。它使用一个看起来像a+a
的re
匹配器
Kevin的
type
方法可以通过一个简单的函数更好地实现:
def mytype(astring):
ll = astring.split(',')
return [int(l) for l in ll]
parser.add_argument('--ids', type=mytype)
它可以推广到处理带引号的字符串,如“1 2 3”type
可以是任何接受字符串并返回所需值的函数,如果无法进行转换,则会引发错误。--
是表示“位置参数从此处开始”的简便方法
使用您的解析器,可以执行以下操作:
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”类型来测试使用哪一个和离开哪一个
现在,如果id
是定位的,那么它将处理123refresh
:
parser.add_argument('ids',type=int,nargs='+')
parser.add_argument('cmd')
parser.parse_args('1 2 3 refresh'.split())
但这是因为解析器使用不同的策略将字符串分配给几个位置参数。它使用一个看起来像a+a
的re
匹配器
Kevin的
type
方法可以通过一个简单的函数更好地实现:
def mytype(astring):
ll = astring.split(',')
return [int(l) for l in ll]
parser.add_argument('--ids', type=mytype)
它可以推广到处理带引号的字符串,如“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会将它们作为单独的参数传递。如果您只想解析形式为--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会将它们作为单独的参数传递。您可以立即解析字符串,而不是稍后再解析,方法是传递一个任意可调用的字符串,如示例中的type
@Kevin a la?是的,准确地说。您可以使用类似as您的类型
,以逗号自动拆分。@Kevin您应该将您的注释转换为应答。您可以立即解析字符串,而不是稍后再解析字符串,方法是传递一个任意可调用的类型
@Kevin a la作为示例?是的,准确地说。您可以使用类似于您的类型的东西来自动拆分逗号。@Kevin您应该将您的注释转换为答案