2009-10-25 67 views
8

我們的框架需要一些醜陋的樣板代碼包裝某些功能:動態地添加功能,以一個Python模塊

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

我想這可能與一裝飾被簡化:

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

然而,轉身這相當棘手,主要是因爲框架在模塊層次上尋找某種模式的函數名稱。

我已經試過裝飾中的以下,但無濟於事:

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 

任何幫助,將不勝感激!

+1

你需要更詳細地解釋一下這些名字框架「看起來」的內容。你可能會重寫__getattr__或者調用你自己的模塊自己的字典來僞裝它,但是在這一點上確實無法說明。 – 2009-10-25 16:55:13

+0

我真的不知道框架究竟做了什麼。奧倫的小提醒是我所需要的。 – AnC 2009-10-25 17:03:16

回答

13

兼用

current_module.new_name = func 

setattr(current_module, new_name, func) 
+0

Duh,當然 - 我在想什麼......謝謝! – AnC 2009-10-25 17:02:20

0

看來解決您的問題將是使裝飾功能用作最初的功能。

嘗試使用功能mergeFunctionMetadata從扭曲,發現這裏: twisted/python/util.py

它使你的裝飾功能用作最初,希望讓框架把它撿起來。

+0

謝謝,這看起來很有趣 - 將不得不考慮如何最好地應用這個。 – AnC 2009-10-26 17:51:47