Добавить в locals () в Python 3.2+? - PullRequest
2 голосов
/ 16 июня 2011

Я пытаюсь программно определить несколько переменных в локальном пространстве имен:

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 ]

7 голосов
/ 16 июня 2011

Ответ: не делай этого.

Если вы хотите программно хранить значения, используйте контейнер:

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

Или создайте класс контейнера, если вам действительно необходимо.

>>> class Container(object):
...     pass
... 
>>> c = Container()
>>> setattr(c, 'a', 5)
>>> c.a
5
5 голосов
/ 16 июня 2011

Почему бы не дать построить собственное пространство имен?

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
0 голосов
/ 16 июня 2011

Согласно документам для местных жителей ():

Содержание этого словаря должно не быть измененным; изменения не могут влияют на значения местных и свободных Переменные, используемые интерпретатором.

Попробуйте поместить их в globals () (это словарь символов для текущего модуля, а не по-настоящему глобальный.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...