一切都是从PEP484开始的

1
2
def greeting(name: str) -> str:
return 'Hello ' + name

使用一种类似golang类型标注的方式来标注类型.

Python3中的Type Hints

Python3中, 可以参考如下的形式:

类方法

1
2
3
4
5
6
# File models/a.py
from models import b
class A(Model):
def foo(self, b: 'b.B'): ...

def bar(self, a: 'A'): ...

不需要为self变量标注, 而且有一点就是, 你可以使用一个字符串'b.B'来表示.

赋值 && 多变量赋值

1
2
x = []                # type: List[Employee]
x, y, z = [], [], [] # type: List[int], List[int], List[str]

For循环与With语句

1
2
3
4
5
6
7
with frobnicate() as foo:  # type: int
# Here foo is an int
...

for x, y in points: # type: float, float
# Here x and y are floats
...

Python2的项目怎么使用?

其实写这篇博客的一大部分都是为了说明Python2中的类型说明的可行性, 因为我接手的项目都是Python2, 对Python3中的Type语法是不支持的, 但是又想使用 确定类型的写法, 官方文档也在此处做了说明.

1
2
3
4
def embezzle(self, account, funds=1000000, *fake_receipts):
# type: (str, int, *str) -> None
"""Embezzle funds from account using fake receipts."""
<code goes here>

将函数变量中的类型放在doc之前, 再加入# type:, 就会自动识别为类型说明了, 对于赋值以及循环语句, 可以参考Python3的做法.

Type Hints到底带来了什么

  1. 更强大的代码补全, 无论你是VSCode还是Vim用户, Python的代码补全提示是想当的 弱. 但当你加上了类型之后. 大大缓解了jedi的工作量, 你会发现, 即使是Vim 的代码提示, 也想当的实用.

  2. 我想, 大部分人一定也认为强类型语言的程序相较于弱类型语言好维护, 其中的两个原因 就是: 1. 编译期报错, 2. 类型确定.

  3. 代码大全里有这么一段话:

    真实世界混乱不堪并不等于你的代码也得同样糟糕. 将你的系统看做理想世界, 混乱的真实世界, 以及从前者到后者的接口的结合.

Code Like

如果你十分喜欢Python的弱类型, 我认为是在与真实世界交互的位置使用, 用来包容这个 混乱的世界. 而在你自己创造的理想的世界中, 不应该存在有类型不确定的对象, 请对自己的世界有足够多的control.

请把类型补上!!!

无论你是不是后端程序员, 在使用Python的时候, 请把类型标注一下. 就当是为了 我们这些贫苦大众, 让我们认识一个新的变量从看到他的类型开始, 好吗?