【发布时间】:2023-01-16 22:34:29
【问题描述】:
我正在使用 Py03 在 Rust 中构建一个 python 模块。我在 Rust 中有一个类,它接受 PyAny 来引用 Python 中的对象。作为 Rust 类的哈希函数的一部分,我想在 Rust 的哈希函数中使用此对象的 Python ID,这样如果在 Rust 类的多个版本中引用了相同的 Python 对象,我可以对 Rust 类进行重复数据删除。我可以在 Rust 的 PyAny 对象中看到 python ID,但无法弄清楚如何将它变成一个我可以传递给哈希器的纯数字。
例如,我在 Rust 中有以下内容:
#[pyclass]
pub struct MyClass {
obj: Option<Py<PyAny>>,
}
#[pymethods]
impl MyClass {
#[new]
fn new(obj: Option<Py<PyAny>>) -> Self {
if obj.is_some() {
println!("Obj: {:?}", obj.as_ref());
}
Self { obj }
}
}
然后,我可以在 Python 中运行:
obj = [1,2,3,4]
print(hex(id(obj)))
# '0x103da9100'
MyClass(obj)
# Obj: Some(Py(0x103da9100))
Python 和 Rust 都显示相同的 ID 数字,这很好,但我如何才能将这个数字 0x103da9100 放入 Rust 变量中?看起来 PyAny 只是一个元组结构,所以我尝试了以下但 Rust 抱怨 PyAny 的字段是私有的:
let obj_id = obj?.0;
【问题讨论】:
-
您可以使用
as_ptr获取PyAny元组的内容,但我不确定如何从那里获取 id(除非 id 只是指针的值)。