假设我有一个命名空间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 :我知道这是一种不好的做法,但这在一些极端情况下会有所帮助,例如我们在快速构建代码和测试非常的时候。
答案 0 :(得分:4)
globals().update(vars(args))
这通常不这个好主意;将这些属性保留在命名空间中。
您可以创建比使用此方法解决的问题更多的问题,尤其是如果您不小心配置了dest
name的参数,这些参数会影响您关注的内置或本地,例如list
或{{ 1}}或者其他什么。玩得开心那个 bug!
命名空间是一个很好的主意 - 让我们做更多的事情!
答案 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')