Question

Qu'est-ce que je passe comme premier paramètre « object » à la fonction setattr(object, name, value), aux variables définies sur le module actuel?

Par exemple:

setattr(object, "SOME_CONSTANT", 42);

donnant le même effet que:

SOME_CONSTANT = 42

dans le module contenant ces lignes (avec le object correct).

Je suis Générez plusieurs valeurs au niveau du module dynamique, et que je ne peux pas définir __getattr__ au niveau du module, c'est mon secours.

Était-ce utile?

La solution

import sys

thismodule = sys.modules[__name__]

setattr(thismodule, name, value)

ou, sans utiliser setattr (qui brise la lettre de la question, mais satisfait aux mêmes fins pratiques; -):

globals()[name] = value

Note : à périmètre du module, celui-ci est équivalent à:

vars()[name] = value

qui est un peu plus concis, mais ne fonctionne pas à partir d'une fonction (vars() donne les variables du champ d'application, il est appelé à: variables du module lorsqu'il est appelé à portée mondiale, et il est OK pour l'utiliser R / W , mais les variables de fonction lorsqu'il a été invité dans une fonction, et il doit être traité comme R / O -. la documentation en ligne Python peut être un peu déroutant au sujet de cette distinction spécifique)

Autres conseils

Si vous devez définir les variables du module scope à partir du module, ce qui ne va pas avec global?

# my_module.py

def define_module_scoped_variables():
    global a, b, c
    a, b, c = 'a', ['b'], 3

ainsi:

>>> 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, vous serez en mesure d'utiliser __getattr__ au niveau du module ( réponse associée ).

Par PEP 562 :

def __getattr__(name):
    if name == "SOME_CONSTANT":
        return 42
    raise AttributeError(f"module {__name__} has no attribute {name}")
  1. Vous ne voudriez pas. Vous feriez globals()["SOME_CONSTANT"] = 42
  2. Vous ne voudriez pas. Vous stocker quelque part le contenu généré dynamiquement autre qu'un module.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top