我正在尝试将一个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
相反,编译时会出现生锈错误:
error[E0609]: no field `a` on type `pyo3::PyObject`
--> src\lib.rs:926:5
|
926 | y.a += 2;
| ^ unknown field
有没有一种方法可以列出rust中的对象字段和方法并对这些字段进行操作?
发布于 2020-04-21 07:52:30
您将在y上调用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__
方法。
https://stackoverflow.com/questions/60354879
复制相似问题