以下所有例子都参考了最新版本的 Python 文档与 mypy 文档

必备条件

安装最新版本的 Python 和 mypy

要学会按需配置自己的编辑器,比如我的 VSCode 就装好了 Python 和 Pyright 扩展

变量

age: int = 1

child: bool
if age < 18:
child = True
else:
child = False

常量

from typing import Final

RATE: Final = 3000

class Base:
DEFAULT_ID: Final = 0 RATE = 300 # Error: can't assign to final attribute
Base.DEFAULT_ID = 1 # Error: can't override a final attribute

内置类型

from typing import List, Set, Dict, Tuple, Optional

x: int = 1
x: float = 1.0
x: bool = True
x: str = "test"
x: bytes = b"test" # 集合类型是首字母大写的
# 元素的类型写在中括号里面(泛型)
x: List[int] = [1]
x: Set[int] = {6, 7} # 字典需要写出 key 和 value 的类型
x: Dict[str, float] = {"field": 2.0} # 元组需要写出所有元素的类型
x: Tuple[int, str, float] = (3, "yes", 7.5) # 用 Optional[] 表示可以为 None 的类型
x: Optional[str] = some_function()
# mypy 可以推断出 if 语句里 x 不能为 None
if x is not None:
print(x.upper())
# 如果 x 的值不可能为 None, 用 assert
assert x is not None
print(x.upper())

函数

from typing import Callable, Iterator, Union, Optional, List

def stringify(num: int) -> str:
return str(num) def plus(num1: int, num2: int) -> int:
return num1 + num2 def f(num1: int, my_float: float = 3.5) -> float:
return num1 + my_float # callable (函数) 类型
x: Callable[[int, float], float] = f # 生成器函数会返回可迭代的元素
def g(n: int) -> Iterator[int]:
i = 0
while i < n:
yield i
i += 1

from typing import ClassVar

class MyClass:
attr: int
# 实例变量可以有默认值
charge_percent: int = 100 # 什么也不返回,就是返回 None def __init__(self) -> None:
... # 实例方法,省略 self 的类型
def my_method(self, num: int, str1: str) -> str:
return num * str1 # 类可以用作类型
x: MyClass = MyClass() # 类变量
class Car:
seats: ClassVar[int] = 4
passengers: ClassVar[List[str]] # 需要注意还没定义就使用一个类会报错
def f(foo: A) -> int: # Error
... class A:
... # 你可以使用字符串的形式来规避
def f(foo: "A") -> int: # OK
...

Named tuples 命名元组

from typing import NamedTuple

class Point(NamedTuple):
x: int
y: int p = Point(x=1, y="x") # Error: Argument has incompatible type "str"; expected "int"

异步迭代器

from typing import AsyncIterator

async def gen() -> AsyncIterator[bytes]:
lst = [b async for b in gen()] # 推断类型是 "List[bytes]"
yield "no way" # Error: Incompatible types (got "str", expected "bytes")

类型别名

AliasType = Union[List[Dict[Tuple[int, str], Set[int]]], Tuple[str, List[str]]]

def f() -> AliasType:
...

Dataclasses 数据类

from dataclasses import dataclass, field

@dataclass
class Application:
name: str
plugins: List[str] = field(default_factory=list) test = Application("Testing...") # OK
bad = Application("Testing...", "with plugin") # Error: List[str] expected

泛型

from typing import TypeVar, Generic

T = TypeVar("T")

class Stack(Generic[T]):    # 泛型
def __init__(self) -> None:
self.items: List[T] = [] def push(self, item: T) -> None:
self.items.append(item) def pop(self) -> T:
return self.items.pop() def empty(self) -> bool:
return not self.items # Stack[int] 实例
stack = Stack[int]()
stack.push(2)
stack.pop()
stack.push("x") # Type error

Literal types

PrimaryColors = Literal["red", "blue", "yellow"]
SecondaryColors = Literal["purple", "green", "orange"]
AllowedColors = Literal[PrimaryColors, SecondaryColors] def paint(color: AllowedColors) -> None: ... paint("red") # OK
paint("turquoise") # Error

Protocol 协议

实现结构化子类型(静态鸭子类型),可以当成接口一样用。

from typing import Iterable, Protocol

class SupportsClose(Protocol):
def close(self) -> None:
... # 函数体可以为空 (explicit '...') class Resource: # 没有写 SupportsClose
def close(self) -> None:
self.resource.release() def close_all(items: Iterable[SupportsClose]) -> None:
for item in items:
item.close() close_all([Resource(), open("some/file")]) # OK

Abstractmethod 抽象方法

方法可以有默认的实现,但是抽象方法规定必须在子类中实现。

from typing import Protocol
from abc import abstractmethod class Example(Protocol):
def first(self) -> int:
return 42 @abstractmethod
def second(self) -> int: # 没有默认实现
raise NotImplementedError # 防止这个方法被调用

Enum 枚举

如果要像 C 语言一样定义枚举的话,也是用类来实现的。

from enum import Enum

class Color(Enum):
RED = 1
GREEN = 2
BLUE = 3 print(Color.RED)

这样就能用类当成枚举一样用了。

参考资料

Python 静态类型检查 mypy 示例的更多相关文章

  1. Java中静态类型检查是如何进行的

    以下内容来自维基百科,关于静态类型检查和动态类型检查的解释: 静态类型检查:基于程序的源代码来验证类型安全的过程: 动态类型检查:在程序运行期间验证类型安全的过程: Java使用静态类型检查在编译期间 ...

  2. Python静态代码检查工具Flake8

    简介 Flake8 是由Python官方发布的一款辅助检测Python代码是否规范的工具,相对于目前热度比较高的Pylint来说,Flake8检查规则灵活,支持集成额外插件,扩展性强.Flake8是对 ...

  3. 理解Flow静态类型检查

    一.为什么在JavaScript中使用静态类型 了解静态类型的最快方法是将其与动态类型进行对比. 有静态类型参数的语言被称为静态类型语言. 另一方面,有动态类型参数的语言被称为动态类型语言.核心区别是 ...

  4. 编译器开发系列--Ocelot语言6.静态类型检查

    关于"静态类型检查",想必使用C 或Java 的各位应该非常熟悉了.在此过程中将检查表达式的类型,发现类型不正确的操作时就会报错.例如结构体之间无法用+ 进行加法运算,指针和数值之 ...

  5. Flow: JavaScript静态类型检查工具

    Flow: JavaScript静态类型检查工具 Flow是Facebook出品的,针对JavaScript的静态类型检查工具.其代码托管在github之上,并遵守BSD开源协议. 关于Flow 它可 ...

  6. flow 静态类型检查 js

    1.flow介绍 https://ustbhuangyi.github.io/vue-analysis/prepare/flow.html#为什么用-flow 2.使用 (1)安装flow (2)项目 ...

  7. 如何使用flow进行静态类型检查

    Flow 是 facebook 出品的 JavaScript 静态类型检查⼯具.Vue.js 的源码利⽤了 Flow 做了静态类型检查,所以了解 Flow 有助于我们阅读源码. 为什么⽤ Flow? ...

  8. Python 加入类型检查

    Python 是一门强类型的动态语言, 对于一个 Python 函数或者方法, 无需声明形参及返回值的数据类型, 在程序的执行的过程中, Python 解释器也不会对输入参数做任何的类型检查, 如果程 ...

  9. flow JavaScript 静态类型检查工具

    内置类型 flow 内置类型有 boolean, number, string, null, void, any, mixed, literal type. 其中 boolean, number, s ...

随机推荐

  1. AcWing 787.归并排序

    AcWing 787.归并排序 题目描述 给定你一个长度为n的整数数列. 请你使用归并排序对这个数列按照从小到大进行排序. 并将排好序的数列按顺序输出. 输入格式 输入共两行,第一行包含整数 n. 第 ...

  2. STM32系列之初探(二)

    问题一: 什么是STM32 新的基于ARM内核的32位MCU系列 内核为ARM公司为要求高性能,低成本,低功耗的嵌入式应用专门设计的Crotex-M内核 标准的ARM体系 特点: 高性能 低电压 低功 ...

  3. pico g2 触摸板手柄射线检测---for unity

    1.pico g2手柄射线检测UI,需要在canvas添加Graphic Raycaster脚本和Pvr_Ui Canvas脚本. 2.删除掉原有的maincamera,将Pvr_unitySDK下h ...

  4. printf的用法进阶

    今天来好好总结一下C语言中关于printf的常用用法 基础部分 printf("%d\n", numInt); printf("%f\n", numFloat) ...

  5. Android View如何获取焦点

    Android新启动Activity,dialog或者其他窗体中中包含EditText, 新启动的activity的焦点默认在EditText上,这是android系统会弹出软键盘,挤压activit ...

  6. 制作ASCII字符动画

    看过Matrix的同学应该还记得,在母舰上一直在计算的电脑屏幕在Neo觉醒的时候,不停的下落的杂乱无章的字符组成了Neo当时所处的场景.其实利用开源和免费的工具,我们可以将现有的视频转换为ASCII字 ...

  7. Elasticsearch系列

    一.Elasticsearch简介 二.elasticsearch集群监控相关

  8. HDU_4496_逆向并查集

    http://acm.hdu.edu.cn/showproblem.php?pid=4496 逆向并查集,先读取,然后从后向前join每次保存答案即可. #include<iostream> ...

  9. Zabbix:主动模式

    简介 Zabbix 是由 Alexei Vladishev 开发的一种网络监视.管理系统,基于 Server-Client 架构.可用于监视各种网络服务.服务器和网络机器等状态,官方站点:https: ...

  10. qt creator源码全方面分析(2-10-3)

    目录 Plugin Meta Data 主键 插件描述键 依赖 可选依赖项 测试依赖项 命令行参数 Test.json示例 插件版本说明 Plugin Meta Data 插件的元数据文件是一个JSO ...