【问题标题】:How to create a heterogeneous Python dict in Rust with PyO3?如何使用 PyO3 在 Rust 中创建异构 Python 字典?
【发布时间】:2020-11-05 09:27:48
【问题描述】:

基于this我可以创建一个同构的Python字典。

如何创建具有混合类型值的字典,例如完成这项工作:

let dict = [ ("num", 8), ("str", "asd") ].into_py_dict(py);

?

【问题讨论】:

    标签: rust pyo3


    【解决方案1】:

    我不是pyo3 的用户,但从Rust 的角度来看,问题在于你试图创建一个异构数组,无论如何这是被禁止的。要解决它,您可以尝试通过使用箱子的PyObject 类型将其转换为同构数组。我无法测试下一个 sn-p 是否有效,我不确定你是否可以让它更简单,但这个想法是成立的:

    let key_vals: &[(&str, PyObject)] = [ ("num", 8.to_object()), ("str", "asd".to_object()) ]
    let dict = key_vals.into_py_dict(py);
    

    【讨论】:

    • 可能需要更多的转换,因为ToPyObject 返回 type PyObject = Py<PyAny>,但不清楚 that 实现 ToPyObject,因此您可能需要获取 PyAny以某种方式从Py 中脱离出来。
    • 谢谢!看来这个想法奏效了。这打印出我所期望的:gist.github.com/tungli/e9afbb82abce2faf8de8635b37713e6a
    【解决方案2】:

    只是为了完成 -- Alex Larionov's idea 工作!

    工作代码sn-p是:

    let key_vals: Vec<(&str, PyObject)> = vec![
        ("num", 8.to_object(py)), ("str", "asd".to_object(py))
    ];
    let dict = key_vals.into_py_dict(py);
    

    全主here

    需要这个额外的导入:

    use pyo3::types::IntoPyDict;
    

    另外,请注意,如果您碰巧需要将 Python None 值放入字典中,而 .to_object(py) 失败,请使用:

    py.None()
    

    改为。

    变量pypyo3::Python 对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-09
      • 1970-01-01
      • 2022-12-04
      • 2018-07-13
      • 1970-01-01
      相关资源
      最近更新 更多