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.

¿Fue útil?

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 : 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}")
  1. Usted no lo haría. Harías globals()["SOME_CONSTANT"] = 42
  2. Usted no lo haría. Se podría almacenar en algún contenido generado dinámicamente que no sea un módulo.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top