j'ai tout à fait quelques fonctions qui utilise des variables globales pour tenir un objet pour être réutilisés dans toute la bibliothèque, par exemple:Création d'un décorateur/cache pour le contrôle variable globale
from some.other.lib import Object1, Object2, Object3, Object4, Object5
def function1(input):
global _object1
try:
_object1
except NameError:
_object1 = Object1
return _object1.func1(input)
def function2(input):
global _object2
try:
_object2
except NameError:
_object2 = Object2
# Use function1 to do something to the input
return _object2.func2(function1(input))
def function3(input):
global _object3
try:
_object3
except NameError:
_object3 = Object3
# Use function1 to do something to the input.
return _object3.func3(function1(input))
def function4(input):
global _object4
try:
_object4
except NameError:
_object4 = Object4
return _object4.func4(input)
def function5(input):
global _object5
try:
_object5
except NameError:
_object5 = Object5
# Use function4 to do something to the input.
return _object5.func5(function4(input))
Est-il possible d'écrire un décorateur tel que le code pour vérifier la variable globale n'a pas besoin d'être codé en dur manuellement pour chacun des function*
?
E.g. quelque chose comme:
def exist_decorator(_object, _class):
try:
_object
except NameError:
_object = _class
return _object
Ainsi, la mise en œuvre de classe réelle pour function4()
ressemblera:
def function4(input):
global _object4
exist_decorator(_object4, Object4)
return _object4.func4(input)
Est-ce quelque chose comme cela syntaxiquement possible en Python avec décorateurs? Sinon, comment puis-je créer un décorateur/cache pour vérifier la variable globale?
Les décorateurs utilisent des fonctions et non des instructions. –
Ai-je raison de supposer que vous abusez simplement des variables globales pour garder une sorte de cache qui n'est utilisé que dans une fonction spécifique? Ou avez-vous l'intention d'utiliser le '_object1' en dehors de la portée de' function1() '? – Alfe
Oui, j'en abuse pour mettre en cache un modèle (plus précisément: https://github.com/alvations/earthy/blob/master/earthy/nltk_wrappers/__init__.py#L27) Mais je pense qu'il doit y avoir un meilleur façon de le faire, mais je ne suis pas sûr de savoir comment découpler le modèle le faire rester dans un cache et quand un utilisateur veut accéder au modèle. – alvas