Приведение PyObjectRef к PyString
У меня есть функция, которая принимает список Python. Я ожидаю, что список будет сделан из строк. Как мне их извлечь?
Arch Linux, Python 3.7, ночная ржавчина 1.33.0, pyo3 0.5.2.
fn f(list: &PyList) -> PyResult<SomeClass> {
for obj in list.iter() {
let rust_string = PyString::from_object(obj, "ASCII", "strict")?.to_string()?;
// fails with `TypeError: decoding str is not supported`
if PyString::is_exact_instance(obj) {
let py_str: PyString = unsafe {std::mem::transmute(str)};
let rust_str = py_str.to_string()?;
// panics with failed assertion in PyString.as_bytes()
}
}
...
}
// Python call site
f(["string1", "string2"])
0 ответов
fn f(list: &PyList) -> PyResult<SomeClass> {
for i in list.iter() {
let mut str_2 = match i.extract() {
Ok(val) =>{
val
},
Err(why) => {
panic!("{:}", why);
String::new()
}
};
println!("{}", str_2);
}
// ...
}
Я предполагаю, что причина в том, что развёртка не работает, и в списке Python может быть любой объект, такой как число, строка или даже dict. В этом случае Fail-safe будет проверять каждый тип данных, который есть в pyo3.