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

2 投票
2 回答
2569 浏览
提问于 2025-04-17 14:45

假设我有一个命名空间叫做 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

但是如果我有很多参数,那我就得为每个参数写一行这样的代码。

有没有其他方法可以一次性导入命名空间里的变量,而不需要一个个来处理呢?

附注: from args import * 这个方法是行不通的。

附注2: 我知道这样做并不是一个好习惯,但在某些特殊情况下,比如快速原型开发和测试时,这样做会很有帮助。

2 个回答

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')
5

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

globals().update(vars(args))

不过,这通常不是个好主意;最好把那些属性留在命名空间里。

这样做可能会引发更多问题,尤其是当你不小心用一个 dest 名称 来配置参数,而这个名称恰好和你关心的内置函数或局部变量重名,比如 listprint 之类的。找出这个错误可不是什么轻松的事!

Tim Peters 在他的《Python之禅》中已经提到过这一点:

命名空间是个非常棒的主意——我们应该多用这些!

撰写回答