¿Cómo llamo a setattr () en el módulo actual?

¿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}") 
    1. Usted no lo haría globals()["SOME_CONSTANT"] = 42
    2. Usted no lo haría Almacenarías el contenido generado dinámicamente en otro lugar que no sea un módulo.