Como llamar en setattr () en el módulo actual?
-
05-10-2019 - |
Pregunta
¿Qué puedo pasar como primer parámetro "object
" al setattr(object, name, value)
función, a las variables de ajuste en el módulo actual?
Por ejemplo:
setattr(object, "SOME_CONSTANT", 42);
dar el mismo efecto que:
SOME_CONSTANT = 42
dentro del módulo que contiene estas líneas (con la object
correcta).
Estoy generar varios valores a nivel de módulo de forma dinámica, y ya que no puedo definir __getattr__
a nivel de módulo, este es mi reserva.
Solución
import sys
thismodule = sys.modules[__name__]
setattr(thismodule, name, value)
o, sin necesidad de utilizar setattr
(que rompe la letra de la pregunta, pero satisface los mismos fines prácticos; -):
globals()[name] = value
Nota ??strong>: al ámbito de 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 ámbito de aplicación se llama al: las variables del módulo cuando se le llama en el ámbito global, y luego está bien que lo utilizan R / W , pero las variables de la función cuando se la llame en una función, y entonces debe ser entendido como R / S -. los documentos en línea Python pueden ser un poco confuso acerca de esta distinción específica)
Otros consejos
Si tiene que establecer variables con ámbito de módulo dentro del módulo, lo que está mal 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, usted será capaz de utilizar __getattr__
a nivel de módulo ( respuesta relacionada).
PEP 562 :
def __getattr__(name):
if name == "SOME_CONSTANT":
return 42
raise AttributeError(f"module {__name__} has no attribute {name}")
- Usted no lo haría. Harías
globals()["SOME_CONSTANT"] = 42
- Usted no lo haría. Se podría almacenar en algún contenido generado dinámicamente que no sea un módulo.