目录
参考链接:https://mmengine.readthedocs.io/zh_CN/latest/notes/code_style.html#id13
什么地方需要
- 公共的 API;
- 容易出现类型相关的错误的代码;
- 难以理解的代码;
- 代码中类型已经稳定,可以注释;
- 权衡代码的安全性、清晰性、灵活性后;
如何写类型注解
- 全部位于一行;
- 另起一行;
- 单独成行;
- 引用尚未定义的类型;
from typing import Optional, List, Tuple
# 全部位于一行
def my_method(self, first_var: int) -> int:
pass
# 另起一行
def my_method(
self, first_var: int,
second_var: float) -> Tuple[MyLongType1, MyLongType1, MyLongType1]:
pass
# 单独成行(具体的应用场合与行宽有关,建议结合 yapf 自动化格式使用)
def my_method(
self, first_var: int, second_var: float
) -> Tuple[MyLongType1, MyLongType1, MyLongType1]:
pass
# 引用尚未被定义的类型
class MyClass:
def __init__(self,
stack: List["MyClass"]) -> None:
pass
注意事项
- 函数或方法中,通常不对 self 和 cls 注解;
- 类型注解的类型可以是内置类型,也可以是自定义类,还可以使用 wrapper 类对类型注解进行装饰;
- 变量类型注解;
# 数值类型
from numbers import Number
# 可选类型,指参数可以为 None
from typing import Optional
def foo(var: Optional[int] = None):
pass
# 联合类型,指同时接受多种类型
from typing import Union
def foo(var: Union[float, str]):
pass
from typing import Sequence # 序列类型
from typing import Iterable # 可迭代类型
from typing import Any # 任意类型
from typing import Callable # 可调用类型
from typing import List, Dict # 列表和字典的泛型类型
from typing import Tuple # 元组的特殊格式
# 虽然在 Python 3.9 中,list, tuple 和 dict 本身已支持泛型,但为了支持之前的版本
# 我们在进行类型注解时还是需要使用 List, Tuple, Dict 类型
# 另外,在对参数类型进行注解时,尽量使用 Sequence & Iterable & Mapping
# List, Tuple, Dict 主要用于返回值类型注解
# 参见 https://docs.python.org/3/library/typing.html#typing.List
# Recommend: 带类型注解的赋值
a: Foo = SomeUndecoratedFunction()
a: List[int]: [1, 2, 3] # List 只支持单一类型泛型,可使用 Union
b: Tuple[int, int] = (1, 2) # 长度固定为 2
c: Tuple[int, ...] = (1, 2, 3) # 变长
d: Dict[str, int] = {'a': 1, 'b': 2}
# Not Recommend:行尾类型注释
# 虽然这种方式被写在了 Google 开源指南中,但这是一种为了支持 Python 2.7 版本
# 而补充的注释方式,鉴于我们只支持 Python 3, 为了风格统一,不推荐使用这种方式。
a = SomeUndecoratedFunction() # type: Foo
a = [1, 2, 3] # type: List[int]
b = (1, 2, 3) # type: Tuple[int, ...]
c = (1, "2", 3.5) # type: Tuple[int, Text, float]