PyAnyは、pyo3でPythonのオブジェクトを表す型。
use pyo3::types::PyAny;
PyAnyがPythonで具体的にどんな型だったのかは、is_instance_ofメソッドで判定できる。
use pyo3::{prelude::*, types::*};
#[pyfunction]
fn my_type(value: Bound<PyAny>) -> PyResult<&str> {
let r = if value.is_instance_of::<PyString>() {
"PyString"
} else if value.is_instance_of::<PyInt>() {
"PyInt"
} else if value.is_instance_of::<PyFloat>() {
"PyFloat"
} else {
"unknown-type"
};
Ok(r)
}
PyAnyから具体的な型へは、extractメソッドで変換できる。
use pyo3::{prelude::*, types::*};
#[pyfunction]
fn my_extract(value: Bound<PyAny>) -> PyResult<String> {
let r = if value.is_instance_of::<PyString>() {
let value: &str = value.extract()?;
format!("PyString: {}", value)
} else if value.is_instance_of::<PyInt>() {
let value: i64 = value.extract()?;
format!("PyInt: {}", value)
} else if value.is_instance_of::<PyFloat>() {
let value: f64 = value.extract()?;
format!("PyFloat: {}", value)
} else {
"unknown-type".to_string()
};
Ok(r)
}