You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python调用Rust编写的Polars DataFrame处理函数时触发TypeError:'builtin_function_or_method'无法被解析为整数

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,但这里有两个关键问题:

  1. polars._utils.construction.dataframe.dataframe_to_pydf是Polars的内部私有函数,官方并不推荐在用户代码中直接使用
  2. 更重要的是,你完全不需要手动转换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对象,完全不需要手动干预。

额外验证与补充

  1. 类型检查:你可以在Python中打印传入的对象类型,确认是标准的Polars DataFrame:

    print(type(df))  # 输出:<class 'polars.dataframe.frame.DataFrame'>
    

    这个类型正是pyo3-polars期望接收的类型。

  2. 版本兼容性确认:你的依赖版本组合是兼容的:

    • 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 06:43:03