python module global-variables getattr setattr

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.


  1. No lo harías Haría globals()["SOME_CONSTANT"] = 42
  2. 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).