首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将Python对象传递给Rust

将Python对象传递给Rust
EN

Stack Overflow用户
提问于 2020-02-23 01:35:03
回答 1查看 345关注 0票数 2

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

Python:

代码语言:javascript
运行
复制
class myclass(object):
    def __init__(self):
        self.a = 3

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

生锈:

代码语言:javascript
运行
复制
#[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调用时的预期结果为:

代码语言:javascript
运行
复制
c = rust_obj(b)
print(c.a)
// 5

相反,编译时会出现生锈错误:

代码语言:javascript
运行
复制
error[E0609]: no field `a` on type `pyo3::PyObject`
   --> src\lib.rs:926:5
    |
926 |         y.a += 2;
    |           ^ unknown field

有没有一种方法可以列出rust中的对象字段和方法并对这些字段进行操作?

EN

回答 1

Stack Overflow用户

发布于 2020-04-21 07:52:30

您将在y上调用clone_ref

代码语言:javascript
运行
复制
let y = x.clone_ref(py);

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

代码语言:javascript
运行
复制
y.a += 2;

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60354879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档