如何为PyO3的#[pymethods]添加对Python不可见的私有方法
在PyO3中实现对Python不可见的隐藏方法
有两种常用方式可以实现Rust类方法对Python不可见,同时支持在Rust内部调用,且允许返回任意Rust原生类型:
方式1:将隐藏方法放在普通impl块中
直接在#[pymethods]注解的impl块之外,定义普通的impl块来存放内部方法,这类方法完全不会暴露给Python:
#[pyclass] pub struct SomeItem; // 普通impl块:仅Rust内部可调用,Python不可见 impl SomeItem { fn hidden_method(&self) -> u8 { 0 } } #[pymethods] impl SomeItem { #[new] pub fn new() -> Self { SomeItem } pub fn method(&self) -> u8 { // 内部调用隐藏方法 self.hidden_method() } }
方式2:在#[pymethods]块中使用#[pyo3(skip)]属性
如果希望把隐藏方法和暴露给Python的方法放在同一个impl块中,可以给目标方法添加#[pyo3(skip)]属性,标记为跳过向Python暴露:
#[pyclass] pub struct SomeItem; #[pymethods] impl SomeItem { #[new] pub fn new() -> Self { SomeItem } pub fn method(&self) -> u8 { self.hidden_method() } #[pyo3(skip)] // 标记该方法不暴露给Python fn hidden_method(&self) -> u8 { 0 } }
注意:PyO3官方提供的跳过暴露属性是#[pyo3(skip)],而非示例中的#[pyo3(ignore)],使用前者才能达到预期效果。
内容的提问来源于stack exchange,提问作者Vladimir Alinsky
相关产品推荐
相关产品推荐

