确定Python包最低兼容版本:新类型提示是否影响低版本运行
Python类型提示向下兼容:3.6+版本能否保留现有类型提示?
我开发了一个Python包,为便于维护使用了较新的Python类型提示特性。仅从类型提示角度出发,该包能否在更低Python版本运行?比如Python 3.6是否支持,还是必须移除所有类型提示?
示例代码如下:
from __future__ import annotations from typing import List, TypeVar, Callable, Union, overload, Optional, Any from .another_module import SomeClass T = TypeVar("T") class ExampleClass: def __init__(self, arr: List[T] = ()): self.arr = arr @overload def find(self, predicate: Callable[[T, Optional[int], Optional[List[T]]], bool]) -> T | None: ... @overload def find(self, predicate: SomeClass) -> T | None: ... def find(self, predicate: Union[SomeClass, Callable[[T, Optional[int], Optional[List[T]]], bool]]) -> T | None: # code goes here def chainable(self) -> ExampleClass: return modified(self)
各类型提示特性的版本兼容性分析
from __future__ import annotations:Python 3.7才引入,3.6完全不支持,该语句在3.6环境下会直接报错。T | None联合类型语法:Python 3.10新增的语法糖,3.6-3.9版本无法识别,必须替换为Optional[T]或Union[T, None]。- 类内返回自身类型
-> ExampleClass:在没有__future__ annotations的情况下,Python 3.6会因为类未完成定义而报错,需要改为字符串形式-> "ExampleClass"。 - 其余特性(
TypeVar、List[T]、Callable、Union、overload、Optional):均在Python 3.6的标准typing模块中支持,无需改动。
兼容3.6+版本的修改方案
不需要移除所有类型提示,只需做以下调整:
- 删除
from __future__ import annotations语句。 - 将所有
T | None替换为Optional[T](比如-> Optional[T])。 - 将
chainable方法的返回类型改为字符串形式:def chainable(self) -> "ExampleClass":。
修改后的兼容代码示例:
from typing import List, TypeVar, Callable, Union, overload, Optional, Any from .another_module import SomeClass T = TypeVar("T") class ExampleClass: def __init__(self, arr: List[T] = ()): self.arr = arr @overload def find(self, predicate: Callable[[T, Optional[int], Optional[List[T]]], bool]) -> Optional[T]: ... @overload def find(self, predicate: SomeClass) -> Optional[T]: ... def find(self, predicate: Union[SomeClass, Callable[[T, Optional[int], Optional[List[T]]], bool]]) -> Optional[T]: # code goes here def chainable(self) -> "ExampleClass": return modified(self)
经过上述修改后,你的包就能在Python 3.6及以上版本正常运行,同时保留所有类型提示的维护便利。
内容的提问来源于stack exchange,提问作者Spedwards
相关产品推荐
相关产品推荐

