SQLAlchemy fetchall()标注返回Sequence[Row[_TP]]实际返回list问题
关于SQLAlchemy fetchall()类型提示与实际返回类型的疑问解答
这是类型系统设计的正常现象,你并没有忽略什么:
类型提示的抽象性
Sequence[Row[_TP]]是Python类型系统中的抽象类型,它用来描述一类具备序列特性的容器(支持索引访问、len()、迭代等操作),而非某个具体的类。SQLAlchemy用它作为fetchall()的返回类型提示,是为了约定返回值的行为能力,而不限制底层的具体实现类。list是Sequence的具体实现
list是Python标准库中Sequence的具体子类,所以实际返回list完全符合类型提示的要求——类型提示只定义了返回值需要满足的接口,而非强制返回某个特定类。代码中的类型标注合理性
你的代码里data_fetched_1: sqlalchemy.Sequence = result_1.fetchall()这个标注是完全合法的,类型检查器(比如mypy)会认可list赋值给Sequence的操作。而运行时用type()打印得到list,只是因为SQLAlchemy在运行时选择了用list作为序列的具体实现。
如果需要更精确的类型标注,你也可以写成:
data_fetched_1: list[sqlalchemy.Row] = result_1.fetchall()
这样既符合运行时实际类型,也能通过类型检查。不过使用Sequence的好处是保留了灵活性——如果未来SQLAlchemy更换返回的序列类型(比如改为tuple),你的类型标注不需要修改。
内容的提问来源于stack exchange,提问作者FluidMechanics Potential Flows
相关产品推荐
相关产品推荐

