Python:从名称空间中提取变量
我在python中使用argparse解析命令行参数:Python:从名称空间中提取变量,python,command-line-arguments,argparse,Python,Command Line Arguments,Argparse,我在python中使用argparse解析命令行参数: parser = ArgumentParser() parser.add_argument("--a") parser.add_argument("--b") parser.add_argument("--c") args = parser.parse_args() 现在我想用a、b和c进行一些计算。然而,我发现一直编写args.a+args.b+args.c是一件令人厌烦的事情 因此,我提取这些变量: a, b, c = [args.a
parser = ArgumentParser()
parser.add_argument("--a")
parser.add_argument("--b")
parser.add_argument("--c")
args = parser.parse_args()
现在我想用a
、b
和c
进行一些计算。然而,我发现一直编写args.a+args.b+args.c
是一件令人厌烦的事情
因此,我提取这些变量:
a, b, c = [args.a, args.b, args.c]
这样我就可以写a+b+c
有没有更优雅的方法
添加许多参数时,手动提取会变得非常繁琐且容易出错。您可以通过调用
locals()
将内容添加到本地范围。它返回一个表示当前可用范围的字典。您也可以给它赋值-locals()['a']=12
将导致a
在本地范围内,值为12。如果您希望它们作为全局变量,可以执行以下操作:
globals().update(vars(args))
如果您在一个函数中,并且希望将它们作为该函数的局部变量,那么可以在Python2.x中这样做,如下所示:
def foo(args):
locals().update(vars(args))
print a, b, c
return
exec "" # forces Python to use a dict for all local vars
# does not need to ever be executed! but assigning
# to locals() won't work otherwise.
这一技巧在Python3中不起作用,在Python3中,exec
不是语句,在其他Python变体(如Jython或IronPython)中也不太可能
不过,总的来说,我建议只为
args
对象使用一个较短的名称,或者使用剪贴板。:-) 您不应该修改locals()
的返回值。它不能保证有效果,通常在CPython中也不会。如果没有前面提到的exec”“
技巧,这似乎是行不通的。谢谢你的回答。它可以工作,但是exec”“
部分感觉像是一个非常丑陋的黑客。为什么有必要这样做?更正:如果函数包含嵌套函数,则不起作用。在这种情况下,会弹出以下错误消息:exec”“语法错误:函数“main”中不允许使用非限定exec。它包含一个带有自由变量的嵌套函数。我不知道,但这是有道理的。闭包需要Python的标准局部变量机制,该机制通过索引访问局部变量。在函数中的任何位置使用exec
语句都会迫使Python使用另一种按名称访问局部变量的方法,因为exec
可以定义或修改局部变量(这也是为什么在函数中看到exec
时可以更新locals()。