EuroPython今天又放出了几十个视频,于是我就挑了几个看。其中一个吸引我的就是关于在python 3.10中使用静态类的。演讲者是从日本连线过去的。欧洲人能大老远请他,肯定有两把刷子。
首先,我安装了python 3.10,今天去python的网站一看,今天正好3.10发布,怎么这么巧。我不下一个都不好意思了。
https://www.python.org/
安装完以后,我就跟着视频写代码了。
我的conda base是python 3.8,所以不用装了。我又装了一个python 3.6
conda create -n py36 python=3.6
这样,我可以在python 3.6, 3.8, 3.10 之间切换。
为什么使用静态类
python静态类已经有5年了。从2015的python 3.5就开始支持静态类了。
- 代码使用者能知道类型
- 他会报错
- 当你在函数的返回值后面按点的时候,“自动完成”功能将可以使用
比如,我们可以比较以下示例
def without_typing(s):
return "Hello " + s
without_typing(1)
def with_typing(s: str) -> str:
return "Hello " + s
with_typing(1)
第一个示例没有type,第二个有。
当你直接运行他们的时候,他们都会报错
TypeError: can only concatenate str (not “int”) to str
但是如果没有类型,那么你只能在程序运行的时候,才知道错了。
而第二种写法,在编辑的时候,就会报错了。
这里,我试了vscode和pycharm。
vscode默认不报错,需要安装mypy,之后才会有错误提示。
VSCode安装mypy
按下F1,输入“Python: Select Linter”,然后选mypy
vscode的错误信息是:
Argument 1 to “with_typing” has incompatible type “int”; expected "str"mypy(error)
pycharm的错误信息是:
Expected type ‘str’, got ‘int’ instead
代码review的时候
def need_new_post():
if ...: return None
elif ...: return False
else ...: return post_id # this is a string
如果没有类型限制,那么你的返回值可能有各种类型。这给这个函数的使用者造成了很大的困扰。
使用built-in类型
有5中built-in类型,可以直接使用,他们是:
bool, bytes, float, int, str
当然,你也可以直接使用None,比如,函数的返回值,可以是None。
你也可以用Any表示任意类型,
from typing import Any
python 3.9 里的泛型集合
集合有dict, frozenset, list, set, tuple
3.9以后他们可以在[]里面写上具体类型。
3.7和3.8, 需要引用
from __future__ import annotations
3.6,需要使用
from typing import List, Dict, Set, Tuple
假如,我们要打印一个str list里面的所有字符串,在python 3.6, 3.8, 3.10的代码分别是:
Python 3.6:
from typing import List
def print_all(l: List[str]