ajout dynamique de fonctions à un module Python
-
06-07-2019 - |
Question
Notre framework nécessite d’emballer certaines fonctions dans un code passe-partout laid:
def prefix_myname_suffix(obj):
def actual():
print 'hello world'
obj.register(actual)
return obj
J'ai pensé que cela pourrait être simplifié avec un décorateur:
@register
def myname():
print 'hello world'
Cependant, cela s’est avéré plutôt délicat, principalement parce que le framework cherche un certain modèle de noms de fonctions au niveau du module.
J'ai essayé ce qui suit chez le décorateur, mais en vain:
current_module = __import__(__name__)
new_name = prefix + func.__name__ + suffix
# method A
current_module[new_name] = func
# method B
func.__name__ = new_name
current_module += func
Toute aide serait appréciée!
La solution
utiliser soit
current_module.new_name = func
ou
setattr(current_module, new_name, func)
Autres conseils
Il semble que la solution à votre problème serait de faire en sorte que la fonction décorée soit la fonction d'origine.
Essayez d’utiliser la fonction mergeFunctionMetadata ??code> de Twisted, trouvée ici:
twisted / python / util.py
Cela fait que votre fonction décorée joue le rôle de l'original, en faisant en sorte que le cadre le récupère.