使用Pandera与Mypy为Polars DataFrame做类型标注的返回类型问题
解决Pandera + Polars LazyFrame类型标注不兼容问题
你遇到的问题是因为MyModel.validate的默认返回类型被推断为父类型DataFrameBase[MyModel],而类型检查器无法自动确认它实际返回的是LazyFrame[MyModel]。以下几种方案可以精确保留LazyFrame的类型精度:
方案1:使用类型断言明确告知类型检查器
通过typing.cast强制指定返回类型,适合需要手动控制校验逻辑的场景:
import polars as pl import pandera.polars as pa from pandera.typing.polars import LazyFrame as PALazyFrame from typing import cast class MyModel(pa.DataFrameModel): a: int class Config: strict = True def foo(f: pl.LazyFrame) -> PALazyFrame[MyModel]: validated_data = MyModel.validate(f.select('a')) return cast(PALazyFrame[MyModel], validated_data)
方案2:使用Pandera的检查装饰器
利用pa.check_output装饰器自动处理类型推断,同时完成校验逻辑,代码更简洁:
import polars as pl import pandera.polars as pa from pandera.typing.polars import LazyFrame as PALazyFrame class MyModel(pa.DataFrameModel): a: int class Config: strict = True @pa.check_output(MyModel, lazy=True) def foo(f: pl.LazyFrame) -> PALazyFrame[MyModel]: return f.select('a')
其中lazy=True参数明确告诉装饰器处理的是LazyFrame类型,类型检查器会自动识别正确的返回类型。
方案3:指定validate方法的泛型返回类型
通过泛型参数直接约束validate方法的返回类型,无需额外断言:
import polars as pl import pandera.polars as pa from pandera.typing.polars import LazyFrame as PALazyFrame class MyModel(pa.DataFrameModel): a: int class Config: strict = True def foo(f: pl.LazyFrame) -> PALazyFrame[MyModel]: return MyModel.validate[PALazyFrame[MyModel]](f.select('a'))
内容的提问来源于stack exchange,提问作者ohe
相关产品推荐
相关产品推荐

