我使用pyo3
Rust crate (0.11.1
版)将Rust 代码移植到cpython(3.8.2
版)代码中.我创建了一个名为my_class
的类,并定义了以下函数:new
、__str__
和__repr__
.
TL;DR:
__str__
函数存在于使用pyo3 crate 从 rust 迹中移植的类上,但仅使用print(obj)
时不会打印,而是必须写入print(obj.__str__())
my_class
的定义如下:
use pyo3::prelude::*;
#[pyclass]
struct my_class {
#[pyo3(get, set)]
num: i32,
#[pyo3(get, set)]
debug: bool,
}
#[pymethods]
impl my_class {
#[new]
fn new(num: i32, debug: bool) -> Self {
my_class {num, debug}
}
fn __str__(&self) -> PyResult<String> {
Ok(format!("[__str__] Num: {}, Debug: {}", self.num, self.debug))
}
fn __repr__(&self) -> PyResult<String> {
Ok(format!("[__repr__] Num: {}, Debug: {}", self.num, self.debug))
}
}
#[pymodule]
fn pymspdb(_py: Python, m: &PyModule) -> PyResult<()> {
m.add_class::<my_class>()?;
Ok(())
}
我构建了它(进入发布模式),并用以下代码测试代码:
from my_module import my_class
def main():
dsa = my_class(1, True)
print(dsa)
print(dsa.__str__())
if __name__ == "__main__":
main()
运行测试python代码时,我得到以下输出:
<my_class object at 0x7fb7828ae950>
[__str__] Num: 1, Debug: true
现在我想到了可能的解决办法.一种解决方案可能是pyo3 rust crate 实际上充当代理,为了将类移植到python中,可以实现某种对象,将所有操作转移到移植的类.所以它可能无法实现自己的__str__
,因此无法满足我的需求.
感谢阅读到目前为止,希望我能找到一个答案,因为我没有找到任何关于这一点的在线.