Hinzufügen von Funktionen dynamisch zu einem Modul Python
-
06-07-2019 - |
Frage
Unser Rahmen erfordert bestimmte Funktionen in einigem hässlichen Standardcode Verpackung:
def prefix_myname_suffix(obj):
def actual():
print 'hello world'
obj.register(actual)
return obj
Ich dachte, dies könnte mit einem Dekorateur vereinfacht werden:
@register
def myname():
print 'hello world'
Allerdings zeigte, dass recht schwierig erwiesen, vor allem, weil der Rahmen für ein bestimmtes Muster von Funktionsnamen auf Modulebene sieht.
Ich habe versucht, die folgende in dem Dekorateur, ohne Erfolg:
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
Jede mögliche Hilfe würde geschätzt!
Lösung
verwenden entweder
current_module.new_name = func
oder
setattr(current_module, new_name, func)
Andere Tipps
Es scheint, die Lösung für Ihr Problem der dekorierten Funktion wirkt als die ursprüngliche Funktion zu machen sei.
Versuchen Sie, die Funktion mergeFunctionMetadata
von Verdrehte verwenden, hier:
verdrehten / Python / util.py
Es macht Ihre dekoriert Funktion wirkt als das Original, hoffentlich der Rahmen macht es abholen.