Программно создавая переменные в Python

Возможный дубликат:
Как программно установить глобальную (модульную) переменную?

У меня есть класс под названием Variable, определенный как таковой:

class Variable(): def __init__(self, name): self.name = name self._value = None def value(self): return self._value def __repr__(self): return self.name 

Я хочу создать 26 однобуквенных экземпляров Capital Variable следующим образом:

 A = Variable('A') B = Variable('B') ... Z = Variable('Z') 

До сих пор я пробовал различные решения, и лучшее, что я придумал, это:

 from string import uppercase for char in uppercase: exec "%s = %s" % (char, Variable(str(char))) in None 

Однако это не работает и дает мне эту ошибку:

 Traceback (most recent call last): File "C:\Users\Administrator\Dev\python\truthtable\truthtable.py", line 7, in <module> exec "%s = %s" % (char, Variable(str(char))) in None File "<string>", line 1, in <module> NameError: name 'A' is not defined 

Что я делаю не так?

6 Solutions collect form web for “Программно создавая переменные в Python”

 from string import uppercase _g = globals() for char in uppercase: _g[char] = Variable(char) 

Является ли это хорошей идеей, остается сомнительной 🙂

Это работает только для globals() (т.е. присвоений уровня модуля), поскольку в определении языка явно указано, что изменение словаря, возвращаемого locals() может фактически не изменять значение каких-либо локальных переменных.

Вы также можете сделать что-то подобное с __dict__ класса или экземпляра.

Самый чистый подход, который я когда-либо видел, заключается в том, чтобы напрямую добавлять переменные (т.е. атрибуты) в вашу программу (то есть основной модуль), как ответили на другой вопрос в StackOverflow :

 import sys from string import ascii_uppercase this_module = sys.modules[__name__] for char in ascii_uppercase: setattr(this_module, char, Variable(char)) print A # Works! 

PS : Ядро разработчиков Python много работало, чтобы сделать возможными модификацию globals() (см. Комментарии к ответу ncoghlan). Таким образом, изменение globals() является альтернативой. Я не уверен, почему многие люди чувствуют, что это не так чисто, хотя (возможно, потому, что тот факт, что globals() может быть изменен, явно не документирован?).

Ну, это не очень хорошо, но вы можете напрямую получить доступ к словарю globals() :

 for c in 'ABC': globals()[c] = Variable(c) 

Вам не нужно использовать exec для этого, как показывают другие ответы, но вот проблема с вашим исходным кодом:

 for char in uppercase: exec "%s = %s" % (char, Variable(str(char))) in None 

Это будет exec A = A , B = B и т. Д. Хотя это может быть интересно, если вы являетесь ярым последователем Objectivism, python не будет заботиться о нем слишком сильно.

Вы хотите, чтобы материал Variable() внутри exec для него имел значение:

 for char in uppercase: exec "%s = Variable('%s')" % (char, char) 

В будущем, если вы пытаетесь использовать exec , сначала попробуйте не делать этого. Во-вторых, напечатайте то, что вы делаете, – это поможет отладить.

Не пытайтесь вставить это в глобальную переменную. Это ужасно. Сделайте это вместо этого.

 import string variables = {} for x in string.ascii_uppercase: variables[x] = Variable(x) 

Например, вы получаете доступ к ним из variables['Q'] .

Если вы хотите получить доступ к атрибутам, вы можете:

 class Variables(object): pass 

а также

 variables = Variables() for x in string.ascii_uppercase: setattr(variables, x) = Variable(x) 

Но в этом случае я бы скорее создал их динамически в классе контейнеров Variables .

 import string class Variable(object): def __init__(self, value): self.value = value def __repr__(self): return "<Variable %s>" % self.value class Variables(object): def __getattr__(self, n): if n in string.ascii_uppercase: v = Variable(n) setattr(self, n, v) return v raise AttributeError("Variables instance has no attribute %s" % n) 

Применение:

 >>> v = Variables() >>> vG <Variable G> >>> vY <Variable Y> >>> vG is vG True 

Простые и чистые, без уродливых хаков (ну, кроме getattr, и это не так уродливо), и вам даже не нужно делать переменные, которые вам не нужны.

 from string import uppercase for c in uppercase: locals()[c] = Variable(c) print A 

Я не уверен, почему вы хотите это сделать.

  • Загрузка большого файла в Python
  • Есть ли функция, которая проверяет, является ли символ в строке буквой в алфавите? (Swift)
  • Заполнение вкладки ipython для пользовательского класса dict
  • Определить тип объекта?
  • перестановки списков python
  • Класс () vs self .__ class __ () при создании объекта?
  • Как избежать «Не удалось получить токен доступа: {« error »:« invalid_grant »} в автономных задачах CAE cron?
  • Python Server socket.error: Протокол недоступен
  • Подчеркивание против двойного подчеркивания с помощью переменных и методов
  • Получить размеры видеофайла
  • TypeError: объект 'module' не вызываемый метод класса python
  • Python - лучший язык программирования в мире.