2008-12-18 73 views
8

下面是一個代碼片段來自內部的TurboGears 1.0.6:Python中的[] -esquent裝飾器語法是什麼意思?

[dispatch.generic(MultiorderGenericFunction)] 
def run_with_transaction(func, *args, **kw): 
    pass 

我無法弄清楚如何把一個表函數定義之前,可能影響它。

在dispatch.generic的文檔字符串,它提到:

注意,使用舊版本的Python時,您必須使用 '[()dispatch.generic]',而不是 '@ dispatch.generic()'。

OK,所以這顯然是一種方式來獲得在Python的裝飾之前版本裝飾類的行爲,但如何赫克可以在可能工作呢?

回答

11

裝飾器語法由PyProtocols提供。最後,需要注意的是,這些「魔法」裝飾器使用了非常偷偷摸摸的黑客攻擊手段:他們濫用sys.settrace()調試器鉤子來跟蹤是否發生任務。Guido的視圖非常暗淡但這個鉤子的現有功能在2.2,2.3或2.4中不會改變,所以不要擔心它太多,這對於裝飾器的「早期訪問」和2.4生命週期將有大量足夠長的時間讓我們的代碼轉換到2.4語法。某處周圍的Python 2.5或2.6,add_assignment_advisor()可以刪除魔法的一部分,只是爲使用它的裝飾向後兼容的包裝。 「」」 http://dirtsimple.org/2004/11/using-24-decorators-with-22-and-23.html

所以這聽起來像這些工作,通過包裝實際的裝飾器在一些魔術,掛鉤到特殊的代碼調試器來操縱實際得到的功能分配。

Python文檔說,這大約settrace

「」」 注 的settrace()函數僅用於實現調試器,分析器,覆蓋工具等。它的行爲是實現平臺的一部分,而不是語言定義的一部分,因此可能無法在所有Python實現可用。 「」」

-2

沒什麼神祕的,它的語法只是以前的樣子。

解析器已經改變了,可能是因爲Python的禪宗主張「在不確定性面前,拒絕誘惑猜測。」

[]應該是隻列出,並有它。

+0

我看代碼,我的Python 2.5解析器解析。當我嘗試使用這種風格的語法在python中聲明一個裝飾器時,它只是用一個項目創建一個列表對象。 什麼版本的Python使用這種語法?我在哪裏可以看到文檔? – 2008-12-18 21:29:13