1

假设我有一个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

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

是否有另一种方法可以从命名空间导入变量而不必一个一个地遍历它们?

PSfrom args import *不起作用。

PS2:我知道这是一种不好的做法,但这在某些极端情况下会有所帮助,例如我们在原型代码和快速测试

4

2 回答 2

4

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

globals().update(vars(args))

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

您可能会产生比使用这种方法解决的问题更多的问题,尤其是如果您不小心配置了一个dest名称会影响您关心的内置或本地名称的参数,例如listorprint或其他东西。玩得开心寻找那个错误!

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

命名空间是一个很棒的想法——让我们做更多的事情!

于 2013-02-04T22:51:49.353 回答
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')
于 2013-02-04T23:08:20.233 回答