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您应该将您的注释转换为答案