【发布时间】:2020-11-25 09:03:51
【问题描述】:
I've written the following module that handles arguments automatically 用于我所有的 python 代码,我定义了我的程序参数的字典,然后 argparse 在解析调用序列时使用它来设置命令行参数和参数类型:
import argparse
def get_args(pars):
parser = argparse.ArgumentParser(description='Dynamic arguments')
# add each key of the default dictionary as an argument expecting the same type
for key,val in pars.items():
parser.add_argument('--'+key,type=type(val))
newpars=vars(parser.parse_args())
# Missing arguments=None need to be overwritten with default value
for key,val in newpars.items():
if val==None:
newpars[key]=pars[key]
return(newpars)
if __name__ == "__main__":
# default values:
pars={"a":1,"animal":"cat","f":3.3}
pars=get_args(pars)
print(pars)
这适用于解析浮点数、整数和字符串...
python3 test.py --f 2.1
{'a': 1, 'animal': 'cat', 'f': 2.1}
但现在我想添加一个可以是数字列表的参数,例如说我的默认 pars 字典是这样的:
pars={"a":1,"animal":"cat","f":3.3,"l":[1]}
现在发生了:
python3 test.py --l [1,2,3]
{'a': 1, 'animal': 'cat', 'f': 3.3, 'l': ['[', '1', ',', '2', ',', '3', ']']}
这不是我想要的,我想要一个数字列表。过去,当我手动一一处理参数时,我会通过使用来解决这个问题
import ast
val=ast.literal_eval("[1,2,3]")
[1, 2, 3]
但是我不能在每个参数上使用 ast.literal_eval,因为当不传递包含数字参数的字符串时它会失败,所以我想试试这个:
try:
parser.add_argument('--'+key,type=type(ast.literal_eval(val)))
except:
parser.add_argument('--'+key,type=type(val))
并将默认列表定义为
l="[1]"
然后返回
【问题讨论】:
-
type参数应该是一个函数。它没有指定一个类。 -
我试图在问题中加强我的语言,我指的是 type 函数的结果实际上,它给了我
,我误解了重点吗? -
type=type(val)仅在type也是一个产生您想要的功能时才有效。int和float工作。bool和list不要。使用nargs时,对每个字符串应用类型函数。
标签: python python-3.x argparse