Компиляция rust в библиотеку python, ошибка не реализована. Как скомпилировать библиотеку ржавчины с ошибкой в модуль python
#[macro_use]
extern crate cpython;
use cpython::{Python, PyResult};
// file: main.rs
use concrete::*;
fn get_cypher(_py: Python, val: &f64) -> PyResult<()> {
// generate a secret key
let secret_key = LWESecretKey::new(&LWE128_1024);
// encoder
let encoder = Encoder::new(100., 210., 8, 0)?;
// encode and encrypt
let message = 106.276;
let mut ciphertext = LWE::encode_encrypt(&secret_key, message, &encoder)?;
// addition between ciphertext and a constant
let constant = 102.0;
ciphertext.add_constant_static_encoder_inplace(constant)?;
// decryption
let output = ciphertext.decrypt_decode(&secret_key)?;
println!("{} + {} = {}", message, constant, output);
Ok(())
}
py_module_initializer!(libmyrustlib, initlibmyrustlib, PyInit_myrustlib, |py, m | {
(m.add(py, "__doc__", "This module is implemented in Rust"))?;
(m.add(py, "get_cypher", py_fn!(py, get_cypher(val: &f64))))?;
Ok(())
});
Итак, я пытаюсь скомпилировать этот код ржавчины, чтобы иметь возможность вызывать его в python, но получаю следующую ошибку:
9 | fn get_cypher(_py: Python, val: &f64) -> PyResult<()> {
| ------------ expected `PyErr` because of this
...
24 | let output = ciphertext.decrypt_decode(&secret_key)?;
| ^ the trait `From<CryptoAPIError>` is not implemented for `PyErr`
Как я могу передать ошибку из ржавчины в python, чтобы я мог скомпилировать этот код? В общем, я думаю, когда библиотека ржавчины реализует ошибку, как я могу убедиться, что я все еще могу скомпилировать код, используя эту библиотеку?
Грузовой файл:
[package]
name = "fhe_play"
version = "0.1.0"
edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
concrete = "0.1.0"
itertools = "0.9.0"
[dependencies.cpython]
version = "0.1"
features = ["extension-module"]
1 ответ
Вам необходимо вручную преобразовать один тип ошибки в другой, если преобразование еще не определено. Вы можете сделать это с
.map_err()
. Вот пример:
let output = ciphertext
.decrypt_decode(&secret_key)
.map_err(|_original_error| {
PyErr::new::<Exception, _>(_py, "some error value")
})?;
ВидетьPyErr
для нескольких способов сделать ошибку Python.