在Python中从命名空间对象导入变量

时间:2013-02-04 22:45:23

标签: python namespaces argparse

假设我有一个命名空间args,我通过调用parser.parse_args()来获取,它解析命令行参数。

如何将此命名空间中的所有变量导入到当前命名空间?

e.g。

parser.add_argument('-p', '--some_parameter', default=1)

args = parser.parse_args()

# ... code to load all variables defined in the namespace args ...

print some_parameter

我当然可以这样做:

some_parameter = args.some_parameter

但如果我有大量参数,我需要为每个参数添加一条这样的行。

是否有另一种从命名空间导入变量的方法,而不必逐个浏览?

PS from args import *不起作用。

PS2 :我知道这是一种不好的做法,但这在一些极端情况下会有所帮助,例如我们在快速构建代码和测试非常的时候。

2 个答案:

答案 0 :(得分:4)

使用vars() function

的结果更新本地命名空间
globals().update(vars(args))

这通常这个好主意;将这些属性保留在命名空间中。

您可以创建比使用此方法解决的问题更多的问题,尤其是如果您不小心配置了dest name的参数,这些参数会影响您关注的内置或本地,例如list或{{ 1}}或者其他什么。玩得开心那个 bug!

蒂姆彼得斯已经在他的禅宗Python中说过这个:

  

命名空间是一个很好的主意 - 让我们做更多的事情!

答案 1 :(得分:0)

可能是最坏的想法:因为你可以将任意对象传递给parse_args(),传递__builtins__模块,以便可以将所有属性都查找为局部变量。

p = argparse.ArgumentParser()
p.add_argument("--foo")
p.parse_args( "--foo bar".split(), __builtins__)
print foo

对于目标不是有效Python标识符的参数,这甚至可以“工作”:

# To use the example given by Francis Avila in his comment on Martijn Pieters' answer
getattr(__builtins__, '2my-param')