Python作为最流行的脚本语言,其优点无需赘述。可是脚本语言天然的弱类型,也给工具人在阅读代码时带来了很多不便。
如下两段代码:
Java:
public class ToolMan {public void helloToolMan(String name) {System.out.print(name);}}
python:
class ToolMan():def hello_tool_man(self,tool_man):print(tool_man)if __name__ == "__main__":bigMaster = ToolMan()bigMaster.hello_tool_man('BIG_MASTER')
没有对比就没有伤害,相比java等静态语言,工具人只凭函数定义是无法了解入参和出参的实际类型,如何使用该函数并不一目了然。
但是自从python3.5有了typing这个LIB包之后,工具人就可以进化为工具“牛”了。
class ToolMan():def hello_tool_man(self,tool_man):print(tool_man)def hello_tool_niu(self,tool_niu:str) -> None:print(tool_niu)if __name__ == "__main__":tool_man = ToolMan()tool_man.hello_tool_man('BIG_MASTER') #向大师致敬tool_man.hello_tool_niu('BIG_NIU') #向大牛致敬tool_man.hello_tool_niu(666) #再6也会告警哦
工具人和工具牛的最大区别,就是没有区别,除了在函数定义上增加了“暗示”,暗示了入参的类型为字符串、返回类型为None。
有了暗示之后,除了对可读性的提升之外,在静态类型检查时,也会有相应的提示。

typing包作为python标准库的全明星替补,当然不止这一个技能。泛型作为高级语言的标配必不可少,typing包赋予了python强大的能力。
from typing import TypeVar#定义泛型类型TT = TypeVar('T')#工具人靠编程赚钱class Coding():def work(self):print('i am coding')#工具人也会烧菜class Cooking():def work(self):print('i am cooking')#工具人也需要睡觉class Sleeping():def work(self):print('i am sleeping')#定义二代工具人:更听话的工具人class ToolManV2():#让做牛做牛,让做马做马def doWork(self,work:T) -> None:work.work()if __name__ == "__main__":tool_man_v2 = ToolManV2()tool_man_v2.doWork(Coding())tool_man_v2.doWork(Cooking())tool_man_v2.doWork(Sleeping())
如果我们对工具人有更高的要求,比如不允许工具人休息,残忍的做法如下:
class Working():def work(self):passclass Coding(Working):def work(self):print('i am coding')class Cooking(Working):def work(self):print('i am cooking')class Sleeping():def work(self):print('i am sleeping')T = TypeVar('T',bound=Working)class ToolManV2():def doWork(self,work:T) -> None:work.work()if __name__ == "__main__":tool_man_v2 = ToolManV2()tool_man_v2.doWork(Coding())tool_man_v2.doWork(Cooking())tool_man_v2.doWork(Sleeping())
这里我们用bound限制了泛型T的基类,所以工具人遗憾地失去了sleeping的机会。

当内卷已经成为常态,所有的工具人都不sleeping的情况下,比拼的就是潜_Rule了。哪个工具人能兼容的规则越多,用户就更喜欢使用哪个工具人。
于是,我们使用Generic,让工具人成为泛型。
class Coding(Working,Generic[S]):def __init__(self,skill:S):self._skill = skilldef work(self):print('i am coding {s}'.format(s = self._skill))if __name__ == "__main__":tool_man2 = ToolManV2()tool_man2.doWork(Coding('hello world'))tool_man2.doWork(Coding(1024))
于是,工具人在被pua的过程中逐渐赋能,但是这样故事会不断重演,工具人的进化之路远远没有结束,大家下期再见~
文章转载自将咖啡转化为程序的工具人,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




