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



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

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

例如

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:我知道这是一种糟糕的做法,但这在某些情况下会有所帮助,比如我们在快速构建代码原型并测试时。

使用vars()函数的结果更新本地命名空间:

globals().update(vars(args))

这通常是一个而不是的好主意;将这些属性保留在名称空间中。

您可能会产生比使用这种方法解决的问题更多的问题,特别是如果您意外地将参数配置为dest名称,而该名称隐藏了您关心的内置或本地名称,例如listprint或其他名称。寻找那个bug玩得开心!

Tim Peters在他的《Python之禅:》中已经阐述了这一点

名称空间是一个非常棒的想法——让我们做更多这样的事情吧!

这可能是有史以来最糟糕的想法:既然可以将任意对象传递给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')

相关内容

  • 没有找到相关文章

最新更新