暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

「Python」工具人之初学typing

将咖啡转化为程序的工具人 2021-09-09
2803

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
          #定义泛型类型T
          T = 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):
            pass

            class 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 = skill


              def 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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

              评论