Python实现Linux管道

502 阅读2分钟

这是我参与更文挑战的第23天,活动详情查看: 更文挑战

好了,该续集了,接上一篇文章Python魔法方法之rrshift,如何实现由冗长的嵌套实现Pythonic的形象简洁的代码?

乘坐地铁(列车进站(到站台候车(刷卡进站(通过安检(前往地铁站())))))

RidingRoad现在的Pythonic的路径

前往地铁站 >> 通过安检 >> 刷卡进站 >> 到站台候车 >> 列车进站 >> 乘坐地铁

先上代码

# -*- coding: utf-8 -*-
import functools


class Pipe:

    def __init__(self, function):
        self.function = function
        functools.update_wrapper(self, function)

    def __rrshift__(self, other):
        return self.function(other)


# 前往地铁站 >> 通过安检 >> 刷卡进站 >> 到站台候车 >> 列车进站 >> 乘坐地铁

def access_to_MTR_station():
    print("1、RidingRoad前往地铁站")

# security_check = Pipe(security_check)
@Pipe
def security_check(other):
    print("2、RidingRoad通过安检")


@Pipe
def payment_entry(other):
    print("3、RidingRoad刷卡进站")


@Pipe
def waiting_for_subway(other):
    print("4、RidingRoad到站台候车")


@Pipe
def train_come(other):
    print("5、列车进站")


@Pipe
def take_the_subway(other):
    print("6、RidingRoad乘坐地铁回家老婆孩子热炕头去了")


# 前往地铁站 >> 通过安检 >> 刷卡进站 >> 到站台候车 >> 列车进站 >> 乘坐地铁
if __name__ == "__main__":
    access_to_MTR_station() >> security_check \
    >> payment_entry >> waiting_for_subway \
    >> train_come >> take_the_subway
# \ 的作用是实现长行的代码换行,上面的跟下面的是一样
# access_to_MTR_station() >> security_check >> payment_entry >> waiting_for_subway >> train_come >> take_the_subway

真的可以?看效果

****************************************
Are you kidding me?
****************************************
1、RidingRoad前往地铁站
2、RidingRoad通过安检
3、RidingRoad刷卡进站
4、RidingRoad到站台候车
5、列车进站
6、RidingRoad乘坐地铁回家老婆孩子热炕头去了
****************************************
Believe it or not. 
All you need to do is take a try.
****************************************

是不是很多疑问?
问题1:函数调用不用括号?
问题2:为什么函数定义里没用到参数还需要传个other参数进去?

先回顾一下>>和<<的规律:
详细例子可以看回上一篇文章Python魔法方法之rrshift

  1. 无论是左移还是右移,命令都从左到右开始。第一个组合的输出将用作下一个操作的左操作符;

  2. 括号按照预期改变了操作顺序

  3. __rshift__和__lshift__操作仅在实现它的类上调用

  4. 如果其中一个类没有实现__rshift__和_lshift_,则调用__rrshift__或__rlshift__操作,自己作为self

问题1解答

函数调用肯定是需要加括号的
这里得以实现不用加括号的原因,是因为调用了__rrshift__了
为什么会调用_rrshift_
再看回规律第4点:如果其中一个类没有实现__rshift__和_lshift_,则调用__rrshift__或__rlshift__操作,自己作为self

1、security_check被加了Pipe装饰器,即
security_check = Pipe(security_check)
2、access_to_MTR_station() >> security_check
3、access_to_MTR_station()就是一个普通函数的返回值,这里是None,由于None仅仅是一个值,这时候security_check将会调用__rrshift__的函数
4、亦即self.function(other),这里加了括号调用函数了
5、即: security_check(None)
其他的同理

问题2解答

再看看规律的第一点的最后一句: 第一个组合的输出将用作下一个操作的左操作符 意思即是:

func1 >> func2
1、func1的结果将作为func2的参数,
2、亦即func2肯定会收到一个参数
3、所以后面的函数必须需要一个形式参数去接收这个参数
4、这里我们用other接收了,尽管我们没有使用

为什么不带参数?下一集继续呗
下一集就高级一点了,实现带参数的传递下去 剧透一下下,需要匿名函数哦