[PYTHON] [Rust] PyO3 renvoie une erreur

J'écrivais une bibliothèque pour Python en utilisant PyO3 dans Rust, mais lorsqu'il y a une contrainte sur l'entrée d'une fonction (par exemple, la racine carrée doit être non négative) et que cette contrainte n'est pas satisfaite. Je ne savais pas comment renvoyer une erreur (ValueError) et cela a pris beaucoup de temps. Je suis sûr que je finirai par refaire la même chose dans environ six mois, mais c'est un problème, je vais donc résumer ce que j'ai découvert.

Papier principal

Je pense que cela ressemblera à ceci [^ 1].

[^ 1]: Ceci est un exemple de code, alors ne mettez pas quelque chose comme NaN? Ou renvoyez ʻinutile si vous utilisez ʻif else.

#[pyfunction]
fn sqrt_rs(value: f64) -> PyResult<f64> {
    if value.is_sign_negative() {
        return Err(pyo3::exceptions::ValueError::py_err(
            "Valeur négative entrée pour sqrt.Veuillez saisir une valeur non négative."
        );
    }

    Ok(value.sqrt())
}

Divers autres types d'erreur sont définis dans pyo3 :: executions. L'utilisation est la même, il suffit d'appeler la fonction py_err.

Commentaire

Les fonctions exposées côté Python retournent un type PyResult <T> côté Rust, mais quel est ce type? PyResult <T> = Result <T, PyErr>. Donc, si une erreur se produit, Ce serait bien de créer une instance de type PyErr, de l'envelopper dans ʻErretreturn. Alors qu'est-ce que le type PyErr`?

PyO3 définit divers types d'erreur Python (tels que ValueError et TypeError) dans le module pyo3 :: exceptions. Ce sont tous des types différents du côté de Rust, donc c'est un peu difficile à gérer tel quel. Par conséquent, PyO3 fournit une structure wrapper PyErr qui contient divers types d'erreur et leurs valeurs. Chaque type d'erreur est accompagné d'une fonction py_err qui renvoie un type PyErr, qui est un argument. Vous pouvez obtenir l'instance PyErr qui encapsule l'instance de type d'erreur souhaitée en passant cette valeur sous la forme.

Les références

Recommended Posts

[Rust] PyO3 renvoie une erreur
nltk.MaxentClassifier.train () renvoie une erreur.
Renvoie toujours une erreur lorsque la validation AnyOf est SelectMultipleField dans WTForms
OperationalError: (psycopg2.OperationalError) donne une erreur
Une erreur s'est produite dans l'imputer de scikit-learn