这是我参与更文挑战的第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
-
无论是左移还是右移,命令都从左到右开始。第一个组合的输出将用作下一个操作的左操作符;
-
括号按照预期改变了操作顺序
-
__rshift__和__lshift__操作仅在实现它的类上调用
-
如果其中一个类没有实现__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接收了,尽管我们没有使用
为什么不带参数?下一集继续呗
下一集就高级一点了,实现带参数的传递下去 剧透一下下,需要匿名函数哦