Python调用Rust编写的Polars DataFrame处理函数时触发TypeError:'builtin_function_or_method'无法被解析为整数
问题重现
你遇到的这个错误很典型,先还原下你的场景:你用Rust结合PyO3、pyo3-polars编写了一个处理Polars DataFrame的函数,通过maturin打包成Python包后,调用时却触发了以下错误:
Traceback (most recent call last):
File "~/Workspace/test-polars/run.py", line 13, in
test_print(pydf)
TypeError: argument 'pydf': 'builtin_function_or_method' object cannot be interpreted as an integer
你的Rust函数逻辑、Cargo.toml依赖、pyproject.toml打包配置看起来都没问题,问题出在Python调用代码的一个细节上。
问题根源
你在Python代码里尝试用dataframe_to_pydf(df)手动转换DataFrame,但这里有两个关键问题:
polars._utils.construction.dataframe.dataframe_to_pydf是Polars的内部私有函数,官方并不推荐在用户代码中直接使用- 更重要的是,你完全不需要手动转换DataFrame——pyo3-polars已经内置了Python Polars DataFrame与Rust端
PyDataFrame的自动转换逻辑,手动转换反而会导致类型不匹配,触发转换错误(错误信息里的"无法解析为整数"是PyO3类型转换失败时的通用模糊提示,本质是传入的对象类型不符合Rust函数的预期)
解决方案
直接修改你的Python调用代码,去掉手动转换步骤,把Polars的DataFrame实例直接传给Rust函数即可:
from rustpackage import test_print import polars as pl # 构造Polars DataFrame df = pl.DataFrame( { "list_a": [["1", "2", "3"], ["5", "5"]], "list_b": [["1", "2", "3", "8"], ["5", "1", "1"]], } ) # 直接传入原始DataFrame,pyo3-polars会自动完成类型转换 test_print(df)
为什么这样能解决问题?
pyo3-polars的核心作用就是打通Python Polars和Rust Polars的类型转换:当你把Python端的pl.DataFrame实例传给Rust的PyDataFrame参数时,PyO3会自动调用pyo3-polars提供的转换逻辑,将其转换成Rust端可以处理的PyDataFrame对象,完全不需要手动干预。
额外验证与补充
类型检查:你可以在Python中打印传入的对象类型,确认是标准的Polars DataFrame:
print(type(df)) # 输出:<class 'polars.dataframe.frame.DataFrame'>这个类型正是pyo3-polars期望接收的类型。
版本兼容性确认:你的依赖版本组合是兼容的:
- polars 0.50.0 ↔ pyo3-polars 0.23.1:pyo3-polars的版本号和Polars的大版本是对齐的(0.23.x对应Polars 0.50.x)
- pyo3 0.25.1 ↔ pyo3-polars 0.23.1:两者的版本也完全匹配,不会因为PyO3版本不兼容导致转换失败
内容来源于stack exchange

