【问题标题】:Passing Python Object Into Rust将 Python 对象传递给 Rust
【发布时间】:2020-02-22 17:35:02
【问题描述】:

我正在尝试将 Python 对象传递给 rust 并使用 Python 对象的字段执行操作。

Python:

class myclass(object):
    def __init__(self):
        self.a = 3

b = myclass()
print(b.a)
// 3

生锈:

#[pyfn(m, "rust_obj")]
fn rust_obj_py(py: Python, x: PyObject) -> PyResult<PyObject> { 
    let y = x.clone_ref(py);
    y.a += 2;
    Ok(y)
}   

从 Python 调用时的预期结果是:

c = rust_obj(b)
print(c.a)
// 5

编译时出现Rust错误:

error[E0609]: no field `a` on type `pyo3::PyObject`
   --> src\lib.rs:926:5
    |
926 |         y.a += 2;
    |           ^ unknown field

有没有办法列出rust中的对象字段和方法并操作字段?

【问题讨论】:

    标签: python rust pyo3


    【解决方案1】:

    你正在打电话给clone_ref

    let y = x.clone_ref(py);
    

    clone_ref 返回另一个PyObject。然后你在调用

    y.a += 2;
    

    并且编译器正确地告诉您“类型 pyo3::PyObject 上没有字段 a”。因为PyObject 不会直接暴露您在 Python 对象中期望的字段(这样做会很困难,因为 python 是动态类型的,而 rust 是静态类型的语言,所以 PyObject 的所有成员都必须在编译时知道-时间)。在这些情况下,文档有助于了解如何使用 PyObject。在那里你会看到你仍然可以访问a,但是你必须通过getattr 方法。为了执行+=,我怀疑您最好通过call_method API 显式调用python 的__iadd__ 方法。

    【讨论】:

      猜你喜欢
      • 2018-11-09
      • 1970-01-01
      • 2015-08-31
      • 1970-01-01
      • 2014-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-07
      相关资源
      最近更新 更多