pyrsistent.typing.PSet运行报错,如何正确导入或注解?
解决Pyrsistent类型注解运行时AttributeError问题
问题现象
一段使用Pyrsistent的代码能通过mypy类型检查,但运行时提示AttributeError: module 'pyrsistent' has no attribute 'typing',代码如下:
import pyrsistent a = pyrsistent.pset([1,2,3]) #reveal_type(a) #执行mypy file.py,返回类型pyrsistent.typing.PSet[buildins.int] #b : pyrsistent.typing.PSet[int] = a #运行时报错:AttributeError: module 'pyrsistent' has no attribute 'typing' #但mypy无报错 print ( a )
解决方案
方案1:显式导入pyrsistent.typing子模块
直接导入该子模块,让Python运行时能找到对应的类型定义:
import pyrsistent from pyrsistent import typing a = pyrsistent.pset([1,2,3]) b: typing.PSet[int] = a print(a)
方案2:使用字符串形式的类型注解
利用PEP 484支持的字符串类型提示,运行时不会解析该类型,仅类型检查器处理:
import pyrsistent a = pyrsistent.pset([1,2,3]) b: "pyrsistent.typing.PSet[int]" = a print(a)
方案3:仅在类型检查时导入类型
借助typing.TYPE_CHECKING常量,该常量在运行时为False,不会执行导入逻辑,避免运行时开销:
import pyrsistent from typing import TYPE_CHECKING if TYPE_CHECKING: from pyrsistent.typing import PSet a = pyrsistent.pset([1,2,3]) b: PSet[int] = a print(a)
问题原因
Pyrsistent的typing子模块仅包含类型定义,且可能仅通过类型 stub 文件(.pyi)提供给类型检查器(如mypy),Python运行时默认不会加载该子模块。因此直接引用pyrsistent.typing会触发属性不存在的错误,而mypy能识别是因为它读取了stub文件中的类型定义。
内容的提问来源于stack exchange,提问作者josinalvo
相关产品推荐
相关产品推荐

