Sou novo em pyo3
, e gostaria de conseguir o seguinte. Meu código principal está em Python, mas gostaria de chamar uma função Rust deste código Python. O truque é que a função Rust deve ser capaz de chamar uma função Python fornecida como argumento.
Digamos que eu tenha uma função Python que não pode ser incorporada dentro do módulo Rust:
def double(x):
return 2*x
Quero criar uma função Rust tomando esta função como argumento:
use pyo3::prelude::*;
fn my_rust_function(a: usize, f: ...) -> PyResult<usize> {
...
}
Por fim, esta função Rust seria usada em algum lugar no mesmo código Python acima:
import rust_module
def double(x):
return 2*x
def main():
return rust_module.my_rust_function(3, double)
Esse comportamento seria possível? Li partes da documentação sobre como chamar Rust do Python e Python do Rust, mas nunca um uso tão duplo.
Em
my_rust_function()
, pegueBound<'_, PyAny>
(ou qualquer variante, comoBorrowed<'_, '_, PyAny>
ouPy<PyAny>
, mas prefira,Bound
a menos que tenha motivos para não fazê-lo) e use ocall0()
método nele para chamá-lo sem argumentos, oucall1()
para chamá-lo apenas com argumentos posicionais, oucall()
para chamá-lo com argumentos posicionais e de palavra-chave.A exportação da função Rust para Python deve ser feita normalmente.
Por exemplo: