【问题标题】:Python: Extract variables out of namespacePython:从命名空间中提取变量
【发布时间】:2012-01-08 12:31:20
【问题描述】:

我在 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

有没有更优雅的方式来做到这一点?

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

【问题讨论】:

    标签: python command-line-arguments argparse


    【解决方案1】:

    如果您希望它们作为全局变量,您可以这样做:

    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 不是语句,在其他 Python 变体(例如 Jython 或 IronPython)中也不太可能。

    不过,总的来说,我建议您只为 args 对象使用一个较短的名称,或者使用您的剪贴板。 :-)

    【讨论】:

    • 感谢您的回答。它有效,但exec "" 部分感觉就像一个非常丑陋的黑客。为什么有必要这样做?
    • 更正:如果函数包含嵌套函数,它不起作用。在这种情况下,会弹出以下错误消息:exec "" SyntaxError: unqualified exec is not allowed in function 'main' it contains a nested function with free variables
    • 伊克。我不知道,但这是有道理的。闭包需要 Python 的标准局部变量机制,它通过索引访问局部变量。在函数的任何地方使用 exec 语句会强制 Python 使用另一种按名称访问局部变量的方法,因为 exec 可以定义或修改局部变量(这也是为什么您可以更新 locals() 如果exec 是在函数中看到,但不是其他的)。
    【解决方案2】:

    您可以通过调用locals() 将内容添加到本地范围。它返回一个表示当前可用范围的字典。您也可以为其赋值 - locals()['a'] = 12 将导致 a 在本地范围内,值为 12。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-15
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多