首页 > 解决方案 > 使用 kwargs 从 Python Rust 函数调用失败

问题描述

我很难去kwargs上班。我明白,就像#[args(args="*")]是为了args#[args(kwargs="**")]是为了kwargs

但是,当我打包以下使用pyo3-pack并尝试test1使用任何参数调用时,我得到了错误MyClass.test1()() takes at most 0 argument (1 given)

我究竟做错了什么?

#![feature(custom_attribute)]
#![feature(specialization)]

use pyo3::prelude::*;
use pyo3::types::{PyDict, PyTuple};

#[pyclass]
struct MyClass {}

#[pymethods]
impl MyClass {
    #[staticmethod]
    #[args(kwargs = "**")]
    fn test1(kwargs: Option<&PyDict>) -> PyResult<()> {
        if let Some(kwargs) = kwargs {
            for kwarg in kwargs {
                println!("{:?}", kwarg);
            }
        } else {
            println!("kwargs is none");
        }
        Ok(())
    }

    #[staticmethod]
    #[args(args = "*")]
    fn test2(args: &PyTuple) -> PyResult<()> {
        for arg in args {
            println!("{:?}", arg);
        }
        Ok(())
    }
}


#[pymodule]
fn test123(_py: Python, m: &PyModule) -> PyResult<()> {
    m.add_class::<MyClass>()?;
    Ok(())
}

标签: rustpyo3

解决方案


我很确定这是 PyO3 中的一个错误:这个检查似乎是nkeywords无缘无故添加的。提交一个GitHub 问题,看看维护者怎么说。


推荐阅读