Polars后端Pandera自定义校验函数被调用两次的问题
Pandera + Polars后端:自定义列级校验函数被重复调用两次的问题
问题现象
- 使用Pandera搭配Polars后端执行Schema校验时,所有自定义列级校验函数都会被调用两次;切换为Pandas后端时,函数仅执行一次
- 未配置Schema/容器级校验,仅设置了列级校验规则
- 实例:10行数据的DataFrame,自定义校验函数
has_valid_format在Pandas环境下被调用10次,Polars环境下被调用20次
排查过程
- 通过
traceback.print_stack和调试语句定位问题,发现Polars的expr.py文件中_map_batches_wrapper.__call__方法被调用了两次 - 推测问题根源是
self._pyexpr.map_batches的调用,导致apply_lambda流程中每列的自定义校验函数被重复执行 - 已确认校验逻辑本身仅触发一次,
expr.py中的wrap_f函数仅定义一次,但最终被调用了两次
复现代码
import polars as pl import pandera as pa from pandera.typing import Series # 自定义校验函数 def has_valid_format(value: str) -> bool: print(f"校验函数被调用:{value}") return len(value) == 5 # 定义Schema class DataSchema(pa.SchemaModel): code: Series[str] = pa.Field(validator=has_valid_format) # 创建测试数据 df = pl.DataFrame({"code": ["abcde", "fghij", "klmno"]}) # 执行校验 DataSchema.validate(df, lazy=False)
运行上述代码后,每条数据的校验函数会被打印两次;切换为Pandas后端(将pl.DataFrame改为pd.DataFrame)则仅打印一次。
内容的提问来源于stack exchange,提问作者Cthulhujr
相关产品推荐
相关产品推荐

