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, 可以改为直接创建