¿Qué paso como primer parámetro ” object
” a la función setattr(object, name, value)
, para establecer variables en el módulo actual?
Por ejemplo:
setattr(object, "SOME_CONSTANT", 42);
dando el mismo efecto que:
SOME_CONSTANT = 42
Dentro del módulo que contiene estas líneas (con el object
correcto).
Generar varios valores en el nivel del módulo dinámicamente, y como no puedo definir __getattr__
en el nivel del módulo, este es mi fallback.
import sys thismodule = sys.modules[__name__] setattr(thismodule, name, value)
o, sin usar setattr
(que rompe la letra de la pregunta pero cumple los mismos propósitos prácticos ;-):
globals()[name] = value
Nota : en el scope del módulo, este último es equivalente a:
vars()[name] = value
que es un poco más conciso, pero no funciona desde dentro de una función ( vars()
proporciona las variables del scope al que se llama: las variables del módulo cuando se llama en el scope global, y luego está bien usarlo en R / W, pero las variables de la función cuando se las llama en una función, y luego se deben tratar como R / O (los documentos en línea de Python pueden ser un poco confusos sobre esta distinción específica).
Si debe configurar las variables de ámbito del módulo desde dentro del módulo, ¿qué hay de malo con global
?
# my_module.py def define_module_scoped_variables(): global a, b, c a, b, c = 'a', ['b'], 3
así:
>>> import my_module >>> my_module.define_module_scoped_variables() >>> a NameError: name 'a' is not defined >>> my_module.a 'a' >>> my_module.b ['b']
En Python 3.7, podrá utilizar __getattr__
en el nivel del módulo ( respuesta relacionada ).
Por PEP 562 :
def __getattr__(name): if name == "SOME_CONSTANT": return 42 raise AttributeError(f"module {__name__} has no attribute {name}")
globals()["SOME_CONSTANT"] = 42