WEB开发网
开发学院软件开发Python 深入 PEAK 的新特性 阅读

深入 PEAK 的新特性

 2007-03-29 12:16:36 来源:WEB开发网   
核心提示: 当然,在 Python 中我们可以通过 class 语句来创建自己的类型,深入 PEAK 的新特性(4),并在喜欢的层次中安插自己的类型,不过现在,我们通常并不关心对象是什么;只要它的味道像鸭子一样好就行了,Python 会很高兴地在品尝鸭子的氛围中把它吃下,我们仍然可以强制搜集某个特定的

当然,在 Python 中我们可以通过 class 语句来创建自己的类型,并在喜欢的层次中安插自己的类型。不过现在,我们仍然可以强制搜集某个特定的类所持有的值。类 IntBetween3And17 在 Python 中并不太难以实现;如果您试图在一个更加受限的类的对象上添加 100,那么返回更加通用的 IntBetween0And1000 的一个实例也不难。

PEAK 的 dispatch 模块所做的是(Eby 和其他贡献者可能这样想,也可能不这样想)创建丰富的参数类型系统,从而增强在原来的 Python 中内嵌的相关类型。然而,dispatch 并没有为创建其他类(内嵌的,或用户定义的)的各种受限成员值提供一些封装程序,而是提供了一种通用函数的方法来实现自己的精心设计的“duck 类型化”(duck 是在 Python 和 Ruby 中经常使用的一个词,意思是“如果某个动物走路像鸭子,叫声也像鸭子,那么我们就可以把它当作是鸭子”)。我们通常并不关心对象是什么;只要它的味道像鸭子一样好就行了,Python 会很高兴地在品尝鸭子的氛围中把它吃下。

下面我们来看一个简单的 doIt() 例子,它使用了一些参数类型化(见清单 3):

清单 3. 使用 PEAK 分派包中的断言分派

import dispatch
@dispatch.generic()
def doIt(foo, other):
  "Base generic function of 'doIt()'"
@doIt.when("isinstance(foo,int) and isinstance(other,str)")
def doIt(foo, other):
  print "foo is an unrestricted int |", foo, other
@doIt.when("isinstance(foo,str) and isinstance(other,int)")
def doIt(foo, other):
  print "foo is str, other an int |", foo, other
@doIt.when("isinstance(foo,int) and 3<=foo<=17 and isinstance(other,str)")
def doIt(foo, other):
  print "foo is between 3 and 17 |", foo, other
@doIt.when("isinstance(foo,int) and 0<=foo<=1000 and isinstance(other,str)")
def doIt(foo, other):
  print "foo is between 0 and 1000 |", foo, other
doIt( 1, 'this') # -> foo is between 0 and 1000 | 1 this
doIt('x', 1234)  # -> foo is str, other an int | x 1234
doIt(10, 'this') # -> foo is between 3 and 17 | 10 this
doIt(20, 'this') # -> foo is between 0 and 1000 | 20 this
doIt(-7, 'this') # -> foo is an unrestricted int | -7 this
try: doIt(2222, 66)
except dispatch.interfaces.NoApplicableMethods:
  print "No Applicable Methods" # -> No Applicable Methods

上一页  1 2 3 4 5 6  下一页

Tags:深入 PEAK 特性

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接