需求描述
假如需要实现一个随机生成三餐的食谱的需求,提供全部随机生成或自定义同时随机生成两种选项,尽量Pythonic。例如,这样调用即可:1
breakfast >> lunch >> dinner
需求分析
1.>> 的语法实现需要使用__rshift__和__rrshift__。
- 自定义一个三餐的列表作为随机选取的对象
- 如果是全部随机生成,则无需传递参数,进行4和5的步骤
- breakfast的结果传递给lunch,在breakfast的结果基础插入lunch
- lunch的结果传递给dinner,在lunch的结果基础插入dinner
- 如果是自定义同时随机生成,则需要一个函数进记录参数,然后重复45步骤
实现>>管道语法
语法例子建议参考前两期推文1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18# -*- coding=utf-8 -*-
import functools
import random
import pprint
class Pipe:
def __init__(self, function):
self.function = function
functools.update_wrapper(self, function)
# 当 >> 两边其中一个没有实现__rshift__时调用
def __rrshift__(self, other):
return self.function(other)
# 实现携带自定义参数
def curry(self, *args, **kwargs):
return Pipe(lambda x: self.function(x, *args, **kwargs))
菜单候取对象
1 | breakfast_menu = ['bacon', 'egg', 'milk', 'porridge', 'bread', 'corn'] |
菜单随机实现
1 | @Pipe |
整体控制及管道实现
1 | if __name__ == "__main__": |
随机生成效果
1 | 菜单是否自动生成?是:1 否:0 |
自定义菜单生成效果
1 | 菜单是否自动生成?是:1 否:0 |
携带参数的实现
1 | # 实现携带自定义参数 |
原理: 匿名函数的*args和**kwargs保存了需要携带的参数。
其他
其他语法,未提到的,欢迎留言沟通