微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PyO3 在 Rust 中实现 python 可迭代类

如何解决PyO3 在 Rust 中实现 python 可迭代类

我已经found example了解了如何在 Rust 中实现 PyIterProtocol。

use pyo3::prelude::*;
use pyo3::PyIterProtocol;
use pyo3::class::iter::IterNextOutput;

#[pyclass]
struct Iter {
    count: usize
}

#[pyproto]
impl PyIterProtocol for Iter {
    fn __next__(mut slf: PyRefMut<Self>) -> IterNextOutput<usize,&'static str> {
        if slf.count < 5 {
            slf.count += 1;
            IterNextOutput::Yield(slf.count)
        } else {
            IterNextOutput::Return("Ended")
        }
    }
}

但我不知道如何实现一个可迭代但本身不是迭代器的容器类。基本上我希望能够像在 Python 中分解我的对象

x,y,z = my_object

解决方法

来自the user guide on Iterator Types

在许多情况下,您会区分被迭代的类型(即 iterable)和它提供的迭代器。在这种情况下,您应该为迭代器和迭代器都实现 PyIterProtocol,但迭代器只需要支持 __iter__(),而迭代器必须同时支持 __iter__()__next__()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。