2009-10-25 10 views
8

Unser Rahmen bestimmte Funktionen in einigem hässlichen Standardcode erfordert Verpackung:dynamisch Hinzufügen von Funktionen zu einer Python-Modul

def prefix_myname_suffix(obj): 
    def actual(): 
     print 'hello world' 
    obj.register(actual) 
    return obj 

ich dies dachte, vielleicht mit einem Dekorateur vereinfacht werden:

,

@register 
def myname(): 
    print 'hello world' 
jedoch, die gedreht aus, weil das Framework nach einem bestimmten Muster von Funktionsnamen auf Modulebene sucht.

Ich habe folgende im Dekorateur versucht, 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!

+1

Sie müssen erklären, was und wie das Framework in diesen Namen ein wenig gründlicher "aussieht". Sie können wahrscheinlich __getattr__ überschreiben oder das Wörterbuch Ihres Moduls wechseln, um es zu fälschen, aber es ist unmöglich, dies zu diesem Zeitpunkt sicher zu sagen. –

+0

Ich weiß ehrlich nicht, was genau das Framework tut. Orens kleine Erinnerung war was ich brauchte. – AnC

Antwort

13

Verwendung entweder

current_module.new_name = func 

oder

setattr(current_module, new_name, func) 
+0

Duh, natürlich - was habe ich mir gedacht ... Danke! – AnC

0

Es scheint, die Lösung für Ihr Problem der dekorierten Funktion wirkt als die ursprüngliche Funktion zu machen wäre.

Versuchen Sie, die Funktion mergeFunctionMetadata von Verdrehte verwenden, hier: twisted/python/util.py

Es macht Ihre dekoriert Funktion wirken als das Original, hoffentlich den Rahmen es macht abholen.

+0

Danke, das sieht interessant aus - muss schauen, wie man das am besten anwendet. – AnC

Verwandte Themen