[PYTHON] [Rust] PyO3 gibt einen Fehler zurück

Ich habe eine Bibliothek für Python mit PyO3 in Rust geschrieben, aber wenn die Eingabe einer Funktion eingeschränkt ist (z. B. muss die Quadratwurzel nicht negativ sein) und diese Einschränkung nicht erfüllt ist. Ich wusste nicht, wie ich einen Fehler zurückgeben sollte (ValueError), und es hat viel Zeit in Anspruch genommen. Ich bin sicher, dass ich in etwa einem halben Jahr wieder dasselbe googeln werde, aber ich werde zusammenfassen, was ich herausgefunden habe, weil es problematisch ist.

Hauptpapier

Ich denke, es wird so aussehen [^ 1].

[^ 1]: Dies ist ein Beispielcode. Geben Sie also nicht so etwas wie "NaN" ein. Oder "Wenn sonst", ist "return" nicht erforderlich.

#[pyfunction]
fn sqrt_rs(value: f64) -> PyResult<f64> {
    if value.is_sign_negative() {
        return Err(pyo3::exceptions::ValueError::py_err(
            "Negativer Wert für sqrt eingegeben.Bitte geben Sie einen nicht negativen Wert ein."
        );
    }

    Ok(value.sqrt())
}

In pyo3 :: executions sind verschiedene andere Fehlertypen definiert. Die Verwendung ist dieselbe. Rufen Sie einfach die Funktion py_err auf.

Kommentar

Auf der Python-Seite bereitgestellte Funktionen geben einen PyResult -Typ auf der Rust-Seite zurück, aber was ist dieser Typ? PyResult = Ergebnis <T, PyErr>. Wenn also ein Fehler auftritt, ` Es wäre schön, eine Instanz vom Typ PyErr zu erstellen, sie in "Err" und "return" zu verpacken. Was ist also der Typ "PyErr"?

PyO3 definiert verschiedene Python-Fehlertypen (wie "ValueError" und "TypeError") im Modul "pyo3 :: Ausnahmen". Dies sind alles verschiedene Typen auf der Rust-Seite, daher ist die Handhabung etwas umständlich. Daher bietet PyO3 eine Wrapper-Struktur "PyErr", die verschiedene Fehlertypen und deren Werte enthält. Jeder Fehlertyp wird von einer "py_err" -Funktion begleitet, die einen "PyErr" -Typ zurückgibt, der ein Argument ist. Sie können die PyErr-Instanz abrufen, die die gewünschte Fehlertypinstanz umschließt, indem Sie diesen Wert als übergeben.

Verweise

Recommended Posts

[Rust] PyO3 gibt einen Fehler zurück
nltk.MaxentClassifier.train () löst einen Fehler aus.
Gibt immer einen Fehler zurück, wenn die AnyOf-Validierung in WTForms SelectMultipleField ist
OperationalError: (psycopg2.OperationalError) gibt einen Fehler aus
Beim Imputator von Scikit-Learn ist ein Fehler aufgetreten