Learning Something from Fluent Python

“Fluent Python” 真是一本不可多得的进阶Python神书!读时感觉就像一个老司机讲他的经历,而你情不自禁的喊“666~”。本文记录一些从书里看到的精彩片段与心得。

singledispatch装饰器

functools.singledispatch 装饰器是在Python 3.4中引入的新特性,类似java 的方法重载,可以让你方便的为不同的类型参数调用不同函数。书中举的一个场景是比如,我们需要为不同的参数生成不同格式的HTML tag,那么如果用一个函数来表达这个逻辑,可能需要非常多的if-else逻辑的跳转,这不仅很繁杂,而且不利于后期的维护与迭代,那么singledispatch 装饰器就可以让你从这个局面里解放出来,如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# -*- coding:utf8 -*-
# Created by frank at 18/06/2017

from functools import singledispatch

@singledispatch
def myprint():
pass

@myprint.register(str)
def _(text):
print("FUCKING STRING! {0}".format(text))

@myprint.register(int)
def _(n):
print("FUCKING INT! {0}".format(n))

@myprint.register(float)
def _(f):
print("FUCKING FLOAT! {0}".format(f))

@myprint.register(tuple)
def _(seq):
print("FUCKING TUPLE!" + str([item for item in seq]))

if __name__ == '__main__':
myprint(1)
myprint(0.5)
myprint('frank')
myprint((1, 2, 3))

结果是

1
2
3
4
FUCK INT! 1
FUCK FLOAT! 0.5
FUCK STRING! frank
FUCK tuple![1, 2, 3]

以上的简单的例子中,singledispatch装饰器为myprint函数的不同参数选择了不同的调用。