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.
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
.
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 ʻErret
return. 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.
Recommended Posts