【譯】PEP-3129 類裝飾器

PEP原文 : https://www.python.org/dev/peps/pep-3129html

PEP標題: Class Decoratorspython

PEP做者: Collin Wintergit

建立日期: 2007-05-01github

合入版本: 3.0函數

譯者豌豆花下貓Python貓 公衆號做者)ui

PEP翻譯計劃https://github.com/chinesehuazhou/peps-cn翻譯

摘要

本 PEP 提議推出類裝飾器,它是對 PEP-318 引入的函數與方法(function and method)裝飾器的擴展。設計

原理闡述

當初討論函數裝飾器是否該在 Python 2.4 中引入時,因爲有元類,因此類裝飾器被視爲晦澀且沒必要要的[1]。可是,在使用 Python 2.4.x 系列發行版本的幾年後,對函數裝飾器及其使用的日益熟悉以後,BDFL 和社區從新評估了類裝飾器,並建議將其包含在 Python 3.0 中[2]。code

這個改變的目的是使某些構造更易於表達,而且減小對 CPython 解釋器的實現細節的依賴。儘管可使用元類來實現相似裝飾器(decorator-like)功能的類,但結果一般使人不快,實現起來也很脆弱[3]。另外,元類是要繼承的,而類裝飾器則不是,這使得元類不適合類裝飾器的某些特定於類的使用場景。諸如 Zope 之類的大型 Python 項目正在經歷這些瘋狂的扭曲,就爲了取得類裝飾器能作到的成績,這一點反而使 BDFL 青睞上了類裝飾器。htm

語義

類裝飾器的語義和設計目標與函數裝飾器的語義和設計目標相同([4],[5]); 惟一的區別是它在裝飾類而不是函數。 如下兩個片斷在語義上是相同的:

class A:
  pass
A = foo(bar(A))


@foo
@bar
class A:
  pass

有關裝飾器的詳細解釋,請查閱 PEP-318。

實現

調整 Python 的語法以支持類修飾符,須要修改兩個規則並添加一個新規則:

funcdef: [decorators] 'def' NAME parameters ['->' test] ':' suite

compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt |
               with_stmt | funcdef | classdef

須要變成這樣:

decorated: decorators (classdef | funcdef)

funcdef: 'def' NAME parameters ['->' test] ':' suite

compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt |
               with_stmt | funcdef | classdef | decorated

添加 decorated 是必要的,以免語法出現含糊。 必須相應地修改 Python AST 和字節碼。 Jack Diederich 提供了參考實現[6]。

驗收

在發佈此 PEP 以後,幾乎沒有討論,這意味着每一個人都以爲應該接受它。

補丁已提交給 Subversion,版本爲 55430。

參考資料

[1] http://www.python.org/dev/peps/pep-0318/#motivation

[2] https://mail.python.org/pipermail/python-dev/2006-March/062942.html

[3] https://mail.python.org/pipermail/python-dev/2006-March/062888.html

[4] http://www.python.org/dev/peps/pep-0318/#current-syntax

[5] http://www.python.org/dev/peps/pep-0318/#design-goals

[6] https://bugs.python.org/issue1671208

版權

本文檔已經放置在公共領域。源文檔:

https://github.com/python/peps/blob/master/pep-3129.txt

公衆號【Python貓】, 本號連載優質的系列文章,有喵星哲學貓系列、Python進階系列、好書推薦系列、技術寫做、優質英文推薦與翻譯等等,歡迎關注哦。

相關文章
相關標籤/搜索