Как мне вызвать setattr () для текущего модуля? - PullRequest
123 голосов
/ 29 мая 2010

Что мне передать в качестве первого параметра "object" в функцию setattr(object, name, value), чтобы установить переменные в текущем модуле?

Например:

setattr(object, "SOME_CONSTANT", 42);

дает такой же эффект, как:

SOME_CONSTANT = 42

внутри модуля, содержащего эти строки (с правильным object).

Я генерирую несколько значений на уровне модуля динамически, и поскольку я не могу определить __getattr__ на уровне модуля, это мой запасной вариант.

Ответы [ 4 ]

191 голосов
/ 29 мая 2010
import sys

thismodule = sys.modules[__name__]

setattr(thismodule, name, value)

или без использования setattr (что ломает букву вопроса, но удовлетворяет тем же практическим целям; -):

globals()[name] = value

Примечание : в области видимости модуля последний эквивалентен:

vars()[name] = value

, который является немного более кратким, но не работает изнутри функции (vars() дает переменные области видимости, в которой он вызывается: переменные модуля при вызове в глобальной области видимости, и тогда можно использовать его R / W, но переменные функции при вызове в функции, а затем ее следует рассматривать как R / O - онлайновые документы Python могут быть немного запутанными по поводу этого конкретного различия).

6 голосов
/ 29 мая 2010

Если вы должны установить переменные области действия модуля внутри модуля, что не так с 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']
4 голосов
/ 18 марта 2018

В Python 3.7 вы сможете использовать __getattr__ на уровне модуля ( связанный ответ ).

за PEP 562 :

def __getattr__(name):
    if name == "SOME_CONSTANT":
        return 42
    raise AttributeError(f"module {__name__} has no attribute {name}")
0 голосов
/ 29 мая 2010
  1. Ты бы не стал. Вы бы сделали globals()["SOME_CONSTANT"] = 42
  2. Ты бы не стал. Вы бы хранили динамически сгенерированный контент где-то, кроме модуля.
...