Macro python_comm::to_py[][src]

macro_rules! to_py {
    ($py : tt, dict, $obj : tt, $($any : tt), +) => { ... };
    ($py : tt, obj, $obj : tt, $($any : tt), +) => { ... };
    ($func : ident, $py : expr, $obj : expr, [$($any : tt), + $(,) *]) => { ... };
    ($func : ident, $py : expr, $obj : expr, $factory : expr,
 [$($any : tt), + $(,) *]) => { ... };
    ($func : ident, $py : expr, $obj : expr, $factory : expr,
 ($field : expr, $value : expr, Decimal)) => { ... };
    ($func : ident, $py : expr, $obj : expr, $factory : expr,
 ($field : expr, $value : expr)) => { ... };
}
Expand description

设置 python dict/obj 中指定字段

用法

use cpython::{Python, PyDict, PyObject};
use python_comm::prelude::*;
use rust_decimal_macros::dec;

let gil = Python::acquire_gil();
let py = gil.python();

let locals = PyDict::new(py);

let _ = py.run(
    r#"
class Something():
  def __init__(self):
    self.a=1
    self.b=1

class Factory():
  def create_decimal(self, s):
    import decimal  # 真实代码不用在这里 import, 嵌入在 py.run 中时, 其它地方 import 总是失败
    return decimal.Decimal(s)

some = Something()

factory = Factory()
"#,
    None,
    Some(&locals),
).unwrap();

let some:PyObject = from_py!(py, dict, locals, "some").unwrap();
let factory:PyObject = from_py!(py, dict, locals, "factory").unwrap();

let a:i32 = from_py!(py, obj, some, "a").unwrap();
assert_eq!(a, 1);

// 用法1:设置 python obj 中指定字段, 其中 obj 是关键字
let _ = to_py!(py, obj, some, [
    ("a", 2),
    ("b", 3),
]).unwrap();
let a:i32 = from_py!(py, obj, some, "a").unwrap();
assert_eq!(a, 2);

// 用法2:设置 python dict 中指定字段, 其中 dict 是关键字

// 用法3:在用法 1-2 基础上指定 Decimal 类型, 需要提供一个实现了 create_decimal 的 factory 对象
let _ = to_py!(py, obj, some, factory, [
    ("a", dec!(2.5), Decimal)
]).unwrap();
let a = from_py!(py, obj, some, "a", Decimal).unwrap();
assert_eq!(a, dec!(2.5));

// 注:python 3.10 的 decimal 模块支持 Capsule, 可以改为直接创建