Как я могу получить доступ к итератору Rust из Python с помощью PyO3?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как я могу получить доступ к итератору Rust из Python с помощью PyO3?

Сообщение Anonymous »

Я новичок в Rust, и мой первый «серьезный» проект заключался в написании оболочки Python для небольшой библиотеки Rust с использованием PyO3. В основном это было довольно безболезненно, но я изо всех сил пытаюсь понять, как предоставить ленивые итераторы Rust Vec для кода Python.

Пока что Я собирал значения, выдаваемые итератором, и возвращал список, что явно не лучшее решение. Вот код, иллюстрирующий мою проблему:

Код: Выделить всё

use pyo3::prelude::*;

// The Rust Iterator, from the library I'm wrapping.
pub struct RustIterator {
type Item = &'a isize;

fn next(&mut self) -> Option {
let result = self.view.get(self.position);
if let Some(_) = result { self.position += 1 };
result
}
}

// The Rust struct, from the library I'm wrapping.
struct RustStruct {
v: Vec
}

impl RustStruct {
fn iter(&self) -> RustIterator {
RustIterator{ position: 0, view: &self.v }
}
}

// The Python wrapper class, which exposes the
// functions of RustStruct in a Python-friendly way.
#[pyclass]
struct PyClass {
rust_struct: RustStruct,
}

#[pymethods]
impl PyClass {
#[new]
fn new(v: Vec) -> Self {
let rust_struct = RustStruct { v };
Self{ rust_struct }
}

// This is what I'm doing so far, which works
// but doesn't iterate lazily.
fn iter(&self) -> Vec {
let mut output_v = Vec::new();
for item in self.rust_struct.iter() {
output_v.push(*item);
}
output_v
}
}
Я пытался обернуть класс RustIterator оболочкой Python, но не могу использовать процедуру #[pyclass] PyO3. макрос с параметрами времени жизни. Я рассмотрел pyo3::types::PyIterator, но это похоже на способ доступа к итератору Python из Rust, а не наоборот.

Как могу ли я получить доступ к ленивому итератору через RustStruct.v в Python? Можно с уверенностью предположить, что тип, содержащийся в Vec, всегда наследует Copy и Clone, и ответы, требующие некоторого кода на конце Python, приемлемы (но менее идеальны).

Подробнее здесь: https://stackoverflow.com/questions/619 ... using-pyo3
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»