Python:从名称空间中提取变量

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

我在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, 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()。