¿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 correcto object
).
Genero varios valores a nivel de módulo de forma dinámica, y como no puedo definir __getattr__
a nivel de módulo, esta es mi alternativa.
vars()
al alcance de nivel de módulo en lugar de dentro de una función.vars()
es equivalente aglobals()
en el alcance del módulo (y, por lo tanto, devuelve un dict verdadero y modificable) pero alocals()
en el alcance de la función (y, por lo tanto, devuelve un pseudodict que nunca se modificará). Lo usovars()
en el alcance del módulo, ya que guarda 3 caracteres, una sílaba, frente a su sinónimo en ese alcanceglobals()
;-)exec ''
: cronometra una función con un par de bucles sustanciales en cada sentido, y verá la importancia de esta optimización central para el rendimiento de Python.Si debe establecer variables de ámbito del módulo desde dentro del módulo, ¿qué tiene de malo
global
?así:
fuente
global but not really
declaración desconcertante. Supongo que puede ser una reliquia histórica que antecede a los espacios de nombres del módulo.En Python 3.7, podrá usarlo
__getattr__
a nivel de módulo ( respuesta relacionada ).Por PEP 562 :
fuente
globals()["SOME_CONSTANT"] = 42
fuente
SOME_CONSTANT
calculado en tiempo de ejecución no es exactamente constante. Y siglobals()
no está disponible para usted, debe acceder a otro módulo para modificar sus atributos; eso hará que la gente se pregunte.