开发者

Add to locals() in Python 3.2+?

I'm开发者_开发问答 trying to programmatically define several variables in the local namespace:

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

However after running this code, none of the variables I presumed to create actually exist despite appearing in locals(). How do I do this in Python 3.2?

Update0

I know locals() is a bad idea, that's why I'm asking this question.


The answer is: don't do that.

If you want to programmatically store values, use a container:

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

Or create a container class, if you really must.

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


Why not give build it's own namespace?

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


According to the docs for locals():

The contents of this dictionary should not be modified; changes may not affect the values of local and free variables used by the interpreter.

Try putting them in globals() (which is the symbol dictionary for the current module, not truly global.)

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜