Skip to content

Latest commit

 

History

History
96 lines (66 loc) · 3.12 KB

File metadata and controls

96 lines (66 loc) · 3.12 KB

Python typing

基本用法

导入类型:

from typing import ...

List(列表):

var: List[int or float] = [2, 3.5]
var: List[List[int]] = [[1, 2], [2, 3]]

Tuple(元组):

person: Tuple[str, int, float] = ('Mike', 22, 1.75)

Dict(字典):

def size(rect: Mapping[str, int]) -> Dict[str, int]:
    return {'width': rect['width'] + 100, 'height': rect['width'] + 100}

Set(集合):

def describe(s: AbstractSet[int]) -> Set[int]:
    return set(s)

Any(所有类型):

def add(a: Any) -> Any:
    return a + 1

# 等价于:
def add(a):
    return a + 1

Callable(可调用类型,通常用来注解一个方法):

def date(year: int, month: int, day: int) -> str:
    return f'{year}-{month}-{day}'

# 返回了 date() 方法本身(为 Callable 类型),中括号内分别标记了返回的方法的参数类型和返回值类型
def get_date_fn() -> Callable[[int, int, int], str]:
    return date

Union(联合类型):

Union[int, str]  # 要么是 int 类型,要么是 str 类型
Union[Union[int, str], float] == Union[int, str, float]  # 联合类型的联合类型等价于展平后的类型
Union[int] == int  # 仅有一个参数的联合类型会坍缩成参数自身
Union[int, str, int] == Union[int, str]  # 多余的参数会被跳过
Union[int, str] == Union[str, int]  # 参数顺序会被忽略

Optional(参数为空或是已经声明的类型):

Optional[str] == Union[str, None]  # 不代表这个参数可以不传递了,而是说这个参数可以传为 None

# 当一个方法执行结束,如果执行完毕就不返回错误信息,如果发生问题就返回错误信息
def judge(result: bool) -> Optional[str]:
    if result: return 'Error Occurred'

TYPE_CHECKING

TYPE_CHECKING 是一个会被第三方静态类型检查器假定为 True 的特殊常量,而在运行时将假定为 False

TYPE_CHECKING 作为一个静态检查的标志,在真正运行代码的时候它是 False,也就是它下面的 import 是不执行的,但它可以为第三方静态类型检查器提供所需要检查的类型。

使用场景:

解决循环导入问题:两个文件相互导入引用,如果不使用 if typing.TYPE_CHECKING: 就直接导入,那么此时就会因为循环导入产生错误。

注意:使用 TYPE_CHECKING 导入的任何对象,只能作为注解使用,不可以真的去使用这些对象,因为这些对象只有在编辑器检查的阶段才会被导入,并且在使用这些类型作为解注时,必须使用引号包裹。否则在真正的代码业务执行时,就会抛出 NameError: xxx is not defined 错误。

参考资料