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

8
我使用python中的argparse来解析命令行参数:

我使用python中的argparse来解析命令行参数:

parser = ArgumentParser()
parser.add_argument("--a")
parser.add_argument("--b")
parser.add_argument("--c")
args = parser.parse_args()

现在我想使用 abc 进行一些计算。然而,我发现每次都写 args.a + args.b + args.c 很繁琐。
因此,我正在提取这些变量:
a, b, c = [args.a, args.b, args.c]

这样我就可以写 a + b + c 了。

有没有更优雅的方法?

当添加许多参数时,手动提取变得非常繁琐且容易出错。

2个回答

9
如果您希望它们作为全局变量,可以采取以下步骤:
globals().update(vars(args))

如果您想将变量作为函数的局部变量使用,可以在Python 2.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.

这个技巧在Python 3中不起作用,因为exec不是一个语句,其他类似Jython或IronPython的Python变体也是如此。
总的来说,我建议只是为args对象使用一个更短的名称,或者使用剪贴板。 :-)

谢谢你的回答。它能够工作,但是exec ""部分感觉像是一个非常丑陋的hack。为什么需要这样做呢? - Lemming
更正:如果函数包含嵌套函数,则无法工作。在这种情况下,会弹出以下错误消息: `exec "" SyntaxError: unqualified exec is not allowed in function 'main' it contains a nested function with free variables` - Lemming
哎呀,我不知道这个,但是这很有道理。闭包需要使用 Python 的标准本地变量机制,该机制通过索引访问本地变量。在函数中的任何位置使用 exec 语句都会强制 Python 使用一种替代的按名称访问本地变量的方法,因为 exec 可以定义或修改本地变量(这也是为什么如果在函数中看到 exec,则可以更新 locals(),否则不能)。 - kindall

0

你可以通过调用 locals() 将变量添加到本地作用域中。它返回一个表示当前可用作用域的字典。你也可以给它赋值 - locals()['a'] = 12 将导致 a 在本地作用域中具有值为12。


不应修改 locals() 的返回值。它不能保证有影响,并且在 CPython 中通常没有影响。http://docs.python.org/library/functions.html#locals - Michael Hoffman
似乎这个方法不起作用,除非使用kindall提到的“exec”技巧。 - Lemming

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接