即将到来的 Python 3000 ::-- ["swordsp"] [DateTime] TableOfContents

概述

PEPs

Access to Names in Outer Scopes

[wiki:peps:pep-3104/ PEP 3104]

Function Annotations

[wiki:peps:pep-3107/ PEP 3107]

Standard Library Reorganization

[wiki:peps:pep-3108/ PEP 3108]

Metaclasses in Python 3000

[wiki:peps:pep-3115/ PEP 3115]

Python 3000 在 metaclass 方面的大改动! 新的 class 定义语法和函数几乎一样,除了 def 换成了 class:

   1 class Foo(base1, base2, metaclass=mymeta, otherkeyword=...):
   2     ...
   3 
   4 bases = (base1, base2)
   5 keywords = {'metaclass':mymeta, 'a':1, 'b':2}
   6 class Foo(*bases, **kw):
   7     ....

另外以前的 metaclass 第一次被调用时,class 的属性字典就已经构建出来了,metaclass 无法控制这个过程,使得有些功能无法实现,比如保持属性定义的顺序! Python 3000 中的 metaclass 可以定义一个叫 __prepare__ 的 class method,返回一个 dict like 对象(只需要定义 __setitem__ 方法),用来控制 class 属性的存储。这个过程用伪码表示大致如下:

   1        def prepare_class(name, *bases, metaclass=None, **kwargs):
   2           if metaclass is None:
   3              metaclass = compute_default_metaclass(bases)
   4           prepare = getattr(metaclass, '__prepare__', None)
   5           if prepare is not None:
   6              return prepare(name, bases, **kwargs)
   7           else:
   8              return dict()

可以看出,class 定义时传入的参数实际上都是传给 metaclass 的。

进展

讨论

PageComment2