在Python 3.2+中添加到locals()?

时间:2011-06-16 00:13:52

标签: python variables python-3.x

我正在尝试以编程方式在本地命名空间中定义几个变量:

for build_step in 'prepare', 'configure', 'make', 'stage', 'package', 'all':
    p = build_subparsers.add_parser(build_step)
    p.set_defaults(build_step=build_step)
    if build_step != 'package':
        p.add_argument('specfile')
    locals()['build_'+build_step+'_parser'] = p
build_prepare_parser
NameError: global name 'build_prepare_parser' is not defined

然而,在运行此代码之后,尽管出现在locals()中,但我认为创建的变量实际上都不存在。我如何在Python 3.2中执行此操作?

Update0

我知道locals()是一个坏主意,这就是我问这个问题的原因。

3 个答案:

答案 0 :(得分:7)

答案是:不要那样做。

如果要以编程方式存储值,请使用容器:

>>> d = dict()
>>> d['a'] = 5

或者如果你真的必须创建一个容器类。

>>> class Container(object):
...     pass
... 
>>> c = Container()
>>> setattr(c, 'a', 5)
>>> c.a
5

答案 1 :(得分:5)

为什么不给它构建自己的命名空间?

class Build(dict):
    def __init__(self):
        self.__dict__ = self

build = Build()
for build_step in 'prepare', 'configure', 'make', 'stage', 'package', 'all':
    p = build_subparsers.add_parser(build_step)
    p.set_defaults(build_step=build_step)
    if build_step != 'package':
        p.add_argument('specfile')
    build[build_step+'_parser'] = p
build.prepare_parser

答案 2 :(得分:-2)

根据本地人docs :(

  

这本词典的内容应该是   不被修改;变化可能不会   影响本地和自由的价值   解释器使用的变量。

尝试将它们放在globals()中(这是当前模块的符号字典,而不是真正的全局模块。)