C'est Appelez Rust de Python pour accélérer! Tutoriel PyO3: Emballage d'une partie de fonction simple ➁
Ce sera une continuation de.
Définissez une classe Rust (struct + méthode) et appelez-la depuis Python
Le but est que.
Cette fois, je vais vous expliquer comment analyser une classe et comment appeler getter et setter via PyO3.
Utilisez le projet que vous avez créé la dernière fois avec cargo new --lib example
.
Bien sûr, il n'y a pas de problème même si vous en créez un nouveau.
Écrivez ce qui suit dans lib.rs
.
//lib.rs
use pyo3::prelude::*;
// ======================RUST CLASS TO PYTHON ======================================
/// Class for demonstration
// this class, MyClass can be called from python
#[pyclass(module = "my_class")]
struct MyClass {
num: i32,
debug: bool,
}
ici,
#[pyclass(module = "my_class")]
Vous permet d'appeler depuis Python via PyO3. J'ai écrit (module =" ma_classe ")
comme un sort, mais je ne comprends pas vraiment ce que cela signifie. Je suis désolé.
Ici, MyClass
est défini comme Struct
et comme une propriété
Il a num: i32
et debug: bool
.
Tout d'abord, écrivez un constructeur pour pouvoir appeler cette classe en tant qu'objet Python.
#[pymethods]
impl MyClass{
#[new]
fn new(num:i32, debug:bool) -> Self{
MyClass{
num: num,
debug: debug
}
}
Ici, en plus de ʻimpl`
#[pymethods]
Est déclaré (décoré?),
Aussi au-dessus du fn new (num: i32, debug: bool)
qui montre le constructeur
#[new]
Notez qu'il a été déclaré.
Ajoutez ceci au module comme dans la fonction précédente:
//lib.rs
use pyo3::{wrap_pyfunction};
// =================CREATING MODULE FOR PYTHON=========================
/// This module is a python module implemented in Rust.
#[pymodule]
fn test_library(py: Python, m: &PyModule) -> PyResult<()> {
m.add_wrapped(wrap_pyfunction!(get_prime_numbers))?;
m.add_class::<MyClass>()?;
Ok(())
}
ici,
m.add_class::<MyClass>()?;
Line ajoute MyClass au module.
Cette fois, en plus de la déclaration de classe, j'écrirai le getter et le setter de propriété afin qu'ils puissent être appelés depuis Python.
//lib.rs
#[pymethods]
impl MyClass{
#[new]
fn new(num:i32, debug:bool) -> Self{
MyClass{
num: num,
debug: debug
}
}
#[getter]
fn get_num(&self) -> PyResult<i32>{
Ok(self.num)
}
#[setter]
fn set_num(&mut self, num: i32) -> PyResult<()>{
self.num = num;
Ok(())
}
}
De cette façon, vous pouvez également appeler des getters et des setters depuis Python via PyO3 en utilisant les décorateurs # [getter]
et # [setter]
.
Cette fois, je n'ai écrit que sur la propriété num
.
Concernant la valeur de retour de getter, puisque le type de «num» est «i32», le côté Python le reçoit comme «PyResult PyResult <()>
.
Les deux lors du passage d'un objet Python
Ok(self.num)
Ok(())
La remise de l'utilisation est la même que la dernière fois.
Les paramètres setup.py
et Cargo.toml
sont les mêmes que la dernière fois, mais juste au cas où
Cargo.toml
[package]
name = "test"
version = "0.1.0"
edition = "2018"
[lib]
name = "test_library"
crate-type = ["cdylib"]
[dependencies.pyo3]
version = "0.9.1"
features = ["extension-module"]
setup.py
from setuptools import setup
from setuptools_rust import Binding, RustExtension
setup(name='ope_rust',
version='0.1',
rust_extensions=[
RustExtension('ope_rust', 'Cargo.toml',
binding=Binding.PyO3)],
zip_safe=False)
Ce sera.
python setup.py install
Vous pouvez compiler en faisant.
Lorsque vous exécutez le programme de test suivant,
test.py
import test_library
if __name__ == "__main__":
# Testing class
print("\ntest for class")
num = 2
debug = True
test = test_library.MyClass(num=num, debug=debug)
print(test.num) # getter test
test.num = 4 # setter test
print(test.num)
$ python test.py
test for class
2
4
Il s'est avéré que la classe pouvait être construite et que les propriétés get et set pouvaient être exécutées.
Le but,
Définissez une classe Rust (struct + méthode) et appelez-la depuis Python
C'était,
Cette fois, j'ai expliqué comment appeler une classe écrite en Rust depuis Python.
Les constructeurs de classe et les getters et setters de propriétés peuvent également être appelés à partir de Python via PyO3.
La prochaine fois, j'aimerais ajouter quelques méthodes de la classe et expliquer diverses conversions de type.
Cette fois par ici.
fin.
Recommended Posts