PyO3在Rust中实现Python迭代器类

3

我找到了一个有关如何在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
1个回答

2

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

在许多情况下,您需要区分正在迭代的类型(即可迭代对象)和它提供的迭代器。在这种情况下,您应该为可迭代对象和迭代器都实现PyIterProtocol接口,但是可迭代对象只需要支持__iter__()函数,而迭代器必须同时支持__iter__()__next__()函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接