如何复用第三方方法参数的类型作为自定义方法参数的类型?
如何复用第三方方法参数的类型作为自定义方法参数的类型?
太懂这种痛苦了——第三方函数的参数类型写得老长,手动复制不仅麻烦,万一后续第三方更新了类型,自己的代码还得跟着改,完全是重复劳动!其实咱们不用手动抄那串复杂的联合类型,Python的类型工具里有现成的办法直接复用第三方参数的类型,下面给你两种实用的方案:
方案一:直接取函数的__annotations__属性
每个定义了类型注解的函数,都会把参数和对应的类型存在__annotations__这个字典里,咱们直接拿img参数对应的类型就行,简单粗暴还好用:
from typing import TypeAlias # 直接从_process的注解里提取img参数的类型 TextInputs: TypeAlias = _process.__annotations__['img'] def process(img: TextInputs) -> None: _process(img)
不过有个小注意点:如果第三方函数的类型注解是用字符串形式写的(比如为了避免循环导入,写成def _process(img: "str | List[str] | ...")),那__annotations__里拿到的会是字符串,不是实际的类型对象,这时候就需要用下面的方案。
方案二:用get_type_hints解析完整类型
typing模块里的get_type_hints函数会自动帮你解析所有类型注解——不管是直接写的类型还是字符串形式的,都会转换成实际的类型对象,兼容性拉满:
from typing import get_type_hints, TypeAlias # 先获取_process函数的所有类型提示(包括参数和返回值) process_type_hints = get_type_hints(_process) # 提取出img参数对应的类型 TextInputs: TypeAlias = process_type_hints['img'] def process(img: TextInputs) -> None: _process(img)
这个方法更稳妥,哪怕第三方库用了字符串注解、延迟导入的类型,它都能正确解析成你能用的类型。
额外小提示
- 如果你用的是Python 3.10及以上版本,
TypeAlias可以直接省略(直接写TextInputs = ...),但加上TypeAlias能让类型检查器(比如mypy、pyright)更明确这是一个类型别名,避免把它当成普通变量。 - 这样定义后,
TextInputs就和_process的img参数类型完全一致了,后续第三方库更新_process的参数类型,你的TextInputs也会自动同步(只要重新运行代码就行),不用手动修改。
内容来源于stack exchange
相关产品推荐
相关产品推荐

