这是我的main.rs文件:
use pyo3::prelude::*;
use pyo3::types::{PyDateTime, PyDate};
fn main() -> () {
Python::with_gil(|py| {
let datetime = py.import("datetime").unwrap();
let my_datetime = datetime.call_method1("datetime", (2022, 3, 28, 0, 0, 0, 0)).unwrap();
println!("isinstance pydatetime: {:?}", my_datetime.is_instance_of::<PyDateTime>().unwrap());
println!("isinstance pydate: {:?}", my_datetime.is_instance_of::<PyDate>().unwrap());
let my_date = datetime.call_method1("date", (2022, 3, 28)).unwrap();
println!("isinstance pydatetime: {:?}", my_date.is_instance_of::<PyDateTime>().unwrap());
println!("isinstance pydate: {:?}", my_date.is_instance_of::<PyDate>().unwrap());
})
}
Run Code Online (Sandbox Code Playgroud)
这是我的Cargo.toml文件:
use pyo3::prelude::*;
use pyo3::types::{PyDateTime, PyDate};
fn main() -> () {
Python::with_gil(|py| {
let datetime = py.import("datetime").unwrap();
let my_datetime = datetime.call_method1("datetime", (2022, 3, 28, 0, 0, 0, 0)).unwrap();
println!("isinstance pydatetime: {:?}", my_datetime.is_instance_of::<PyDateTime>().unwrap());
println!("isinstance pydate: {:?}", my_datetime.is_instance_of::<PyDate>().unwrap());
let my_date = datetime.call_method1("date", (2022, 3, 28)).unwrap();
println!("isinstance pydatetime: {:?}", my_date.is_instance_of::<PyDateTime>().unwrap());
println!("isinstance pydate: {:?}", my_date.is_instance_of::<PyDate>().unwrap());
})
}
Run Code Online (Sandbox Code Playgroud)
如果我运行上面的代码,我会得到
isinstance pydatetime: true
isinstance pydate: true
isinstance pydatetime: true
isinstance pydate: true
Run Code Online (Sandbox Code Playgroud)
我觉得这有点奇怪,因为直接在 Python 中运行,我得到:
[package]
name = "tmp"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
pyo3 = { version = "0.18.0", features = ["auto-initialize"] }
Run Code Online (Sandbox Code Playgroud)
所以,我本来期望
my_date.is_instance_of::<PyDateTime>().unwrap()
Run Code Online (Sandbox Code Playgroud)
也成为false
为什么情况并非如此,我如何区分一个对象是否是一个对象datetime,而date无需诉诸更多的黑客方法(例如检查)dt.get_type().name()?
我已向 PyO3 提交了一个拉取请求,应该可以解决此问题: https: //github.com/PyO3/pyo3/pull/3071
diff --git a/src/types/datetime.rs b/src/types/datetime.rs
index 85860728568..2c995356e2c 100644
--- a/src/types/datetime.rs
+++ b/src/types/datetime.rs
@@ -228,7 +228,7 @@ pub struct PyDateTime(PyAny);
pyobject_native_type!(
PyDateTime,
crate::ffi::PyDateTime_DateTime,
- *ensure_datetime_api(Python::assume_gil_acquired()).DateType,
+ *ensure_datetime_api(Python::assume_gil_acquired()).DateTimeType,
#module=Some("datetime"),
#checkfunction=PyDateTime_Check
);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
129 次 |
| 最近记录: |