我试图使用
argparse
模块,但如果我像这样传递,它就会被接收为字符串
'(1,2,3,4)'
。我试着用
type=tuple
来替换
argparse.add_argument
,但在这里没有用。
我是否需要添加一个新的类型类并将其传递给
add_argument
的类型参数?
我根据答案尝试了
ast.literal_eval
。谢谢你的帮助。但它在结果中给出了空格,如下图所示。
(1,2,3,4)
<type 'str'>
(1, 2, 3, 4)
<type 'tuple'>
3 个回答
0 人赞同
将data
的nargs
参数设置为nargs="+"
(指一个或多个),类型设置为int
,然后你可以在命令行上这样设置参数。
--data 1 2 3 4
args.data
现在将是一个[1, 2, 3, 4]
的列表。
如果你必须有一个元组,你可以这样做。
my_tuple = tuple(args.data)
把这一切放在一起。
parser = argparse.ArgumentParser()
parser.add_argument('--data', nargs='+', type=int)
args = parser.parse_args()
my_tuple = tuple(args.data)
0 人赞同
如果你想扩大这个规模,不处理语法树,并在参数中提供元组转换,你需要一个自定义的argparse类型。(我需要这个,因为我的分析器在一个包里,我不想要求我的用户都写my_tuple = tuple(args.data)
。有了参数类型,你也可以像原来的问题那样接收一个带括号的字符串。另外,我不会包括nargs
,因为那会把你的自定义类型输出包成一个列表,这基本上违背了你的自定义类型的目的。我映射了一个float,因为我的输入是类似 "0.9, 0.99 "的东西,但是你的int也是一样的。
def tuple_type(strings):
strings = strings.replace("(", "").replace(")", "")
mapped_int = map(int, strings.split(","))
return tuple(mapped_int)
parser = argparse.ArgumentParser()
parser.add_argument('--data', type=tuple_type)
args = parser.parse_args()
这样你就可以发送--data "(1,2,3,4)"
或--data "1,2,3,4"
。
0 人赞同
我有同样的要求。在标准包中找不到。所以,就推出了这个。 Python 3x。放在简单的argv解析器中,一次调用一个参数。
var is passed in default, of correct type.
argval is found command line string. Comma separated,no spaces. i.e. 1,2,3 or one,two,three.
在bash shell下工作,可能需要引号,其他shell和操作系统也需要调整。
同样的技术适用于非列表类型。这个版本在var[0]的基础上创建一个同质的列表或元组。
./foo.py --mytuple 1,2,3,4,5
code:
def chk_arg( var, argstr, dbg=False):
### loop on sys.argv here .....