Python 3.6中如何为函数参数指定多类型静态类型检查?
解决Python 3.6中函数参数多类型标注的问题
刚接触Python类型提示的话,确实会遇到这种语法误区~你之前用def foo(x: [Point, Dot])的写法是不对的,因为方括号在这里会被解析成「参数x是一个包含Point/Dot实例的列表」,而不是「x可以是Point或Dot类型」。针对你的需求,有合适的实现方式,适配Python 3.6的话优先用下面这种:
方法1:使用typing.Union(Python 3.5+支持)
Python 3.6还不支持3.10才引入的|联合类型语法,所以需要从标准库的typing模块导入Union来实现「参数可以是多个类型之一」的标注:
from typing import Union class Point: pass class Dot: pass def foo(x: Union[Point, Dot]) -> None: # 这里写你的函数逻辑 print("参数类型符合要求")
这样静态类型检查工具(比如mypy)就会识别:传入foo的参数必须是Point或Dot的实例,其他类型会触发检查警告,完全满足你的需求,不用拆分两个函数。
额外小提示
- 如果你后续升级到Python 3.10+,可以简化成更直观的写法:
def foo(x: Point | Dot) -> None:,效果和Union完全一致。 - 要是你想让
Point和Dot共享一套方法规范,也可以考虑定义抽象基类(ABC)或者协议(Protocol,需要Python 3.8+或安装typing-extensions兼容旧版本),不过这属于进阶用法,你的需求用Union就足够解决了。
内容的提问来源于stack exchange,提问作者adhdj
相关产品推荐
相关产品推荐

