[关闭]
@bergus 2015-12-11T10:29:00.000000Z 字数 1167 阅读 1680

python笔记之中缀语法和管道实现

python 中缀语法 管道


你知道什么是中缀语法吗?你知道python中的中缀操作是什么吗?那你知道操作python也是可以像unix的管道符一样方便吗?那么,废话不说了,直接上代码。

  1. class Pipe(object):
  2. def __init__(self, function):
  3. self.function = function
  4. def __ror__(self, other):
  5. return self.function(other)
  6. def __call__(self, *args, **kwargs):
  7. return Pipe(lambda x: self.function(x, *args, **kwargs))
    Julien Palard 大神十分的抱歉,直接附上了您的代码,希望您不要介意。
    在上面的代码中__ror__就是我们python中看到的或操作符,在这里代码重载了或操作符,然后把它变成我们梦寐以求的管道操作符,十分的犀利,我很喜欢。我实在是忍不住想发表一下我的见解,谈谈我对这段代码的认识,如有错误,请扔鸡蛋。

一个例子

  1. @Pipe
  2. def take(iterable, qte):
  3. "Yield qte of elements in the given iterable."
  4. for item in iterable:
  5. if qte > 0:
  6. qte -= 1
  7. yield item
  8. else:
  9. return
  10. @Pipe
  11. def add(x):
  12. return sum(x)
这是大神代码中一个take函数的实现,意思是得到一个序列的前qte个值的迭代器,add函数我就不废话了。然后我们来运行一个栗子吧。

一个参数的情况

  1. print [1,2,3,4] | add #10,答案是毫无疑问. 但是,为什么呢?Pipe作为add的装饰器,被装饰过add实际上返回的是Pipe的对象,只不过是对象中拥有了这个add方法。那么,列表在执行管道操作的时候,实际上是Pipe对象调用了__ror__方法,列表参数传给了__ror__.返回值也就是__ror__函数的返回值.

那么请看多参数情况是怎样的吧?

  1. [1,2,3,4] | take(2) #答案返回的是包含1,2的迭代器。那么,带参数和不带参数到底有什么不一样的呢?上面我说过,add函数实际上就是一个Pipe的实例,而在这里也不例外,take函数也是Pipe的一个实例,既然take是一个对象,那么它为什么可以在后面加上一个括号呢?哈哈,很简单,因为__call__函数重载了括号操作符,如果一个类中实现了这个方法,那么该类的对象可以像函数那样使用,然后调用__call__方法,所以take(2)实际上是调用了Pipe的__call__方法,然后又返回了一个新的Pipe实例,接下来就和上面的add一样了。

最后附上Julien Palard大神的github

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注