“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
|
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函数的不同参数选择了不同的调用。