2

找到了如何在 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
4

1 回答 1

3

来自迭代器类型的用户指南

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

于 2021-06-22T06:01:13.277 回答