虽然python是动态类型语言, 但是python3.5引入的类型注解特性却很有用. 不但有助于源码阅读, 而且在类型提示和代码自动补全上也很方便. 但是它毕竟不是静态类型编译型语言, 有一些特殊的情况, 需要一些小技巧才能够处理.
引用后面定义的类型
由于python不是编译型语言, 如果在前面直接引用后面定义的类型是不行的. 如下所示:
会提示未定义的类.
此时有两种处理办法:
- 使用字符串类型注解
test:'Test' = None
class Test:pass
- 引入支持后向类型注解的特性
from __future__ import annotations
test:Test = None
class Test:pass
引用其他模块的类型, 但是又不真正导入此模块
有时候需要引用其他模块中定义的类型, 但是又不能真正导入此模块(不能真正导入的原因往往是避免循环的问题), 此时可以采用如下的技巧:
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from xxx import Yyy
其中TYPE_CHECKING
变量在真正执行时是False, 并不会真正导入模块; 但是在类型检查时为True, 这样就可以享受类型注解的好处了.