Что мне передать в качестве первого параметра object
функции setattr(object, name, value)
, чтобы установить переменные в текущем модуле?
Например:
setattr(object, "SOME_CONSTANT", 42);
дает тот же эффект, что и:
SOME_CONSTANT = 42
внутри модуля, содержащего эти строки (с правильными object
).
Я динамически генерирую несколько значений на уровне модуля, и, поскольку я не могу определить __getattr__
на уровне модуля, это мой запасной вариант.
vars()
на уровне модуля, а не внутри функции.vars()
эквивалентноglobals()
области видимости модуля (и поэтому возвращает истинный, изменяемый словарь), ноlocals()
области видимости функции (и поэтому возвращает псевдодикт, который нельзя изменять). Я используюvars()
в области модуля, так как он сохраняет 3 символа, один слог, по сравнению с его синонимом в этой областиglobals()
;-)exec ''
: установите функцию с парой существенных циклов в каждую сторону, и вы увидите важность этой базовой оптимизации для производительности Python.В Python 3.7 вы сможете использовать
__getattr__
на уровне модуля ( соответствующий ответ ).Согласно PEP 562 :
def __getattr__(name): if name == "SOME_CONSTANT": return 42 raise AttributeError(f"module {__name__} has no attribute {name}")
источник
Если вы должны установить переменные области модуля изнутри модуля, что не так
global
?# my_module.py def define_module_scoped_variables(): global a, b, c a, b, c = 'a', ['b'], 3
таким образом:
>>> import my_module >>> my_module.define_module_scoped_variables() >>> a NameError: name 'a' is not defined >>> my_module.a 'a' >>> my_module.b ['b']
источник
global but not really
заявление озадачивающим. Я полагаю, что это может быть исторический реликт, предшествующий пространствам имен модулей.globals()["SOME_CONSTANT"] = 42
источник
SOME_CONSTANT
вычисление во время выполнения не совсем постоянное. А еслиglobals()
он недоступен для вас, значит, вы должны обратиться к другому модулю, чтобы изменить его атрибуты; это обязательно заставит людей задуматься.