1

我有一个接受 Python 列表的函数。我希望列表由字符串组成。我如何提取它们?

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"])

软件版本:Python 3.7、nightly Rust 1.33.0、pyo3 0.5.2。

4

1 回答 1

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);
    }
    // ...
}

我想这就是 unwrap 无法正常工作的答案,并且 python 列表可能有任何对象,如数字或字符串,甚至是 dict。在这种情况下,故障安全将检查 pyo3 中包含的每种数据类型。

于 2020-11-06T05:26:50.900 回答