python - ¿Cómo llamo a setattr() en el módulo actual?
module global-variables (4)
¿Qué paso como primer parámetro " object
" a la función setattr(object, name, value)
para establecer las 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).
__getattr__
varios valores en el nivel del módulo de forma dinámica, y como no puedo definir __getattr__
en el nivel del módulo, este es mi retroceso.
- No lo harías Haría
globals()["SOME_CONSTANT"] = 42
- No lo harías Almacenaría contenido generado dinámicamente en algún lugar que no sea un módulo.
En Python 3.7, podrá usar __getattr__
a nivel de 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}")
Si debe establecer las variables del ámbito del módulo desde el módulo, ¿qué ocurre 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'']
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 fines prácticos ;-):
globals()[name] = value
Nota : en el alcance 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()
da las variables del alcance al que se llama: las variables del módulo cuando se llama al alcance global, y luego está bien usarlo R / W, pero las variables de la función cuando se llama en una función, y luego debe tratarse como R / O - los documentos en línea de Python pueden ser un poco confusos sobre esta distinción específica).