Que dois-je passer comme premier paramètre " object
" à la fonction setattr(object, name, value)
, pour définir des variables 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 bon object
).
Je génère dynamiquement plusieurs valeurs au niveau du module, et comme je ne peux pas définir __getattr__
au niveau du module, c'est ma solution de secours.
vars()
au niveau du module de portée plutôt qu'à l'intérieur d'une fonction.vars()
équivaut àglobals()
at module scope (et renvoie donc un dict vrai et modifiable) mais àlocals()
at function scope (et donc retourne un pseudodict à ne jamais être modifié). J'utilisevars()
à la portée du module car il enregistre 3 caractères, une syllabe, par rapport à son synonyme dans cette portéeglobals()
;-)exec ''
: chronométrez une fonction avec quelques boucles substantielles dans chaque sens, et vous verrez l'importance de cette optimisation de base pour les performances de Python.Si vous devez définir des variables de portée du module à partir du module, quel est le problème
global
?Donc:
la source
global but not really
déclaration déroutante. Je suppose que ce peut être une relique historique qui précède les espaces de noms de module.En Python 3.7, vous pourrez utiliser
__getattr__
au niveau du module ( réponse associée ).Selon PEP 562 :
la source
globals()["SOME_CONSTANT"] = 42
la source
SOME_CONSTANT
calcul au moment de l'exécution n'est pas exactement constant. Et siglobals()
vous n'êtes pas disponible, vous devez accéder à un autre module pour modifier ses attributs; cela va forcément amener les gens à s'interroger.