Es wird eine Fortsetzung von sein.
Definieren Sie eine Rust-Klasse (struct + method) und rufen Sie sie von Python aus auf
Das Ziel ist das.
Dieses Mal werde ich erklären, wie man eine Klasse analysiert und wie man Getter und Setter über PyO3 aufruft.
Verwenden Sie das Projekt, das Sie zuletzt mit "load new --lib example" erstellt haben. Natürlich gibt es kein Problem, auch wenn Sie ein neues erstellen.
Schreiben Sie Folgendes in 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,
}
Hier,
#[pyclass(module = "my_class")]
Ermöglicht das Aufrufen von Python über PyO3. Ich habe "(module =" my_class ")" als Zauber geschrieben, aber ich verstehe nicht wirklich, was es bedeutet. Es tut mir Leid.
Hier wird MyClass
als Struct
und als Eigenschaft definiert
Es hat num: i32
und debug: bool
.
Schreiben Sie zunächst einen Konstruktor, damit Sie diese Klasse als Python-Objekt aufrufen können.
#[pymethods]
impl MyClass{
#[new]
fn new(num:i32, debug:bool) -> Self{
MyClass{
num: num,
debug: debug
}
}
Hier oben auf "impl"
#[pymethods]
Wird deklariert (dekoriert?),
Auch über dem fn new (num: i32, debug: bool )
, das den Konstruktor zeigt
#[new]
Beachten Sie, dass es deklariert wurde.
Fügen Sie dies dem Modul wie in der vorherigen Funktion hinzu:
//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(())
}
Hier,
m.add_class::<MyClass>()?;
Line fügt dem Modul MyClass hinzu.
Dieses Mal werde ich zusätzlich zur Klassendeklaration den Property Getter und Setter schreiben, damit sie von Python aus aufgerufen werden können.
//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(())
}
}
Auf diese Weise können Sie auch Getter und Setter von Python über PyO3 aufrufen, indem Sie die Dekoratoren # [getter]
und # [setter]
verwenden.
Diesmal habe ich nur über die Eigenschaft num
geschrieben.
In Bezug auf den Rückgabewert von Getter empfängt die Python-Seite ihn als "PyResult
Beides beim Übergeben eines Python-Objekts
Ok(self.num)
Ok(())
Die Übergabe erfolgt wie beim letzten Mal.
Die setup.py
und Cargo.toml
sind die gleichen wie beim letzten Mal, aber nur für den Fall
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)
Es wird sein.
python setup.py install
Sie können kompilieren, indem Sie.
Wenn Sie das folgende Testprogramm ausführen,
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
Es stellte sich heraus, dass die Klasse konstruiert und die Eigenschaften get und set ausgeführt werden konnten.
Das Ziel,
Definieren Sie eine Rust-Klasse (struct + method) und rufen Sie sie von Python aus auf
Es war,
Dieses Mal erklärte ich, wie man eine in Rust geschriebene Klasse aus Python aufruft.
Klassenkonstruktoren und Getter und Setter von Eigenschaften können auch von Python über PyO3 aufgerufen werden.
Beim nächsten Mal möchte ich einige Methoden der Klasse hinzufügen und verschiedene Typkonvertierungen erläutern.
Diesmal hier.
Ende.
Recommended Posts