Comment dois-je appeler setattr () sur le module actuel?
-
05-10-2019 - |
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.
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}")
- Vous ne voudriez pas. Vous feriez
globals()["SOME_CONSTANT"] = 42
- Vous ne voudriez pas. Vous stocker quelque part le contenu généré dynamiquement autre qu'un module.