Macro python_comm::from_py[][src]

macro_rules! from_py {
    ( $py:tt, dict, $($any:tt),+ ) => { ... };
    ( $py:tt, obj, $($any:tt),+ ) => { ... };
    ( $($any:tt),+ default $default:expr $(,)* ) => { ... };
    ( raw, $fn1:ident, $fn2:ident, $py:ident, $obj:ident, $field:expr ) => { ... };
    ( $fn1:ident, $fn2:ident, $py:ident, $obj:ident, $field:expr $(,)* ) => { ... };
    ( $fn1:ident, $fn2:ident, $py:ident, $obj:ident, $field:expr, datetime $(,)* ) => { ... };
    ( $fn1:ident, $fn2:ident, $py:ident, $obj:ident, $field:expr, Decimal $(,)* ) => { ... };
    ( $fn1:ident, $fn2:ident, $py:ident, $obj:ident, $field:expr, $type:ty $(,)* ) => { ... };
}
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 os = py.import("os").unwrap();
let pobj: PyObject = os.get(py, "environ").unwrap().extract(py).unwrap();

// 用法1:从 python obj 中提取指定字段, 其中 obj 是关键字
let pdict:PyDict = from_py!(py, obj, pobj, "_data").unwrap();
let error:Result<PyDict, _> = from_py!(py, obj, pobj, "none");
assert!(error.is_err());

// 用法2:从 python dict 中提取指定字段, 其中 dict 是关键字
let drive:String = from_py!(py, dict, pdict, "SYSTEMDRIVE").unwrap();
assert_eq!(drive, "C:");
let error:Result<String, _> = from_py!(py, dict, pdict, "none");
assert!(error.is_err());

let locals = PyDict::new(py);
locals.set_item(py, "decimal", py.import("decimal").unwrap()).unwrap();
locals.set_item(py, "datetime", py.import("datetime").unwrap()).unwrap();
let pdict:PyDict = py
    .eval(
        r#"{"time": datetime.datetime.now(), "num": decimal.Decimal('2.5'), "text": "abc"}"#,
        None,
        Some(&locals),
    )
    .unwrap()
    .extract(py)
    .unwrap();

// 用法3:在用法 1-2 基础上指定 datetime 类型
let time = from_py!(py, dict, pdict, "time", datetime).unwrap();
assert!(time.date().year() >= 2021);

// 用法4:在用法 1-2 基础上指定 Decimal 类型
let num = from_py!(py, dict, pdict, "num", Decimal).unwrap();
assert_eq!(num, dec!(2.5));

// 用法5:在用法 1-2 基础上指定 其它 类型
let text = from_py!(py, dict, pdict, "text", String).unwrap();
assert_eq!(text, "abc");

// 用法6:在用法 1-5 基础上指定缺省值, 注意 default 前后不需要逗号
let default = from_py!(py, dict, pdict, "none" default String::from("default")).unwrap();
assert_eq!(default, "default");