2009-10-25 17 views
8

Nasze ramy wymaga zawijania niektórych funkcji w jakimś brzydkim standardowy kod:dynamicznie dodawanie funkcji do modułu Pythona

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

wyobraziłem to może być uproszczone z dekoratora:

@register 
def myname(): 
    print 'hello world' 

jednak, że zamienił może być dość trudne, głównie dlatego, że framework szuka określonego wzorca nazw funkcji na poziomie modułu.

Próbowałem następujących w dekoratora, bezskutecznie:

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 

Każda pomoc będzie mile widziana!

+1

Musisz wyjaśnić, co i jak ramka "wygląda" w tych nazwach nieco dokładniej. Prawdopodobnie możesz zastąpić __getattr__ lub przekręcić własny słownik modułu, aby go sfałszować, ale w tej chwili nie można powiedzieć tego na pewno. –

+0

Szczerze mówiąc nie wiem, co dokładnie robi framework. Małe przypomnienie Orena było tym, czego potrzebowałem. – AnC

Odpowiedz

13

użycie albo

current_module.new_name = func 

lub

setattr(current_module, new_name, func) 
+0

Duh, oczywiście - co myślałem ... Dzięki! – AnC

0

Wydaje się, że rozwiązaniem problemu byłoby, aby zdobione akt funkcjonować jako pierwotnej funkcji.

Spróbuj użyć funkcji mergeFunctionMetadata ze skręconych, znaleźć tutaj: twisted/python/util.py

To sprawia, że ​​urządzone akt funkcji jak oryginał, z nadzieją podejmowania ramy go odebrać.

+0

Dzięki, że wygląda interesująco - trzeba będzie sprawdzić, jak najlepiej to zastosować. – AnC

Powiązane problemy