Pythonのdatetimeモジュールの日付型は、PyO3 0.27ではpyo3::typesのPyDateTime等で扱う。
日付(年月日)は、PyO3ではpyo3::types::PyDateで扱う。
関数の引数や戻り値の型としては、Py<PyDate>を指定する。
use pyo3::prelude::*;
#[pymodule]
mod example_pyo3 {
use pyo3::{prelude::*, types::*};
〜
#[pyfunction]
fn inc_date(py: Python, date: &Bound<PyDate>) -> PyResult<Py<PyDate>> {
let year = date.get_year();
let month = date.get_month();
let day = date.get_day();
let next_date = PyDate::new(py, year, month, day + 1)?;
Ok(next_date.into())
}
}
pyが必要な場合、第1引数に「py: Python」を定義しておく。
Py<PyDate>はポインターのようなものらしく、into_pyobject(py)でオブジェクトとして扱えるようになる。
Pythonプロジェクト側で、datetimeモジュールを依存ライブラリーに追加しておく。
cd call-pyo3 uv add datetime
import datetime
import example_pyo3
def main():
print("Hello from call-pyo3!")
print(example_pyo3.inc_date(datetime.date(2025, 12, 13)))
if __name__ == "__main__":
main()
> cd call-pyo3 > uv run main.py Hello from call-pyo3! 2025-12-14
Rustで日付を扱うchronoクレートをPyO3 0.27で使う例。
まず、chronoクレートを依存ライブラリーに追加する。
cd example-pyo3 cargo add chrono
次に、pyo3にchronoフィーチャーを追加する。
〜
[dependencies]
chrono = "0.4.42"
pyo3 = { version = "0.27.2", features = ["chrono"] }
PyDateとchrono::NaiveDateを変換する例。
use pyo3::prelude::*;
#[pymodule]
mod example_pyo3 {
use pyo3::{prelude::*, types::*};
〜
#[pyfunction]
fn inc_date(py: Python, date: &Bound<PyDate>) -> PyResult<Py<PyDate>> {
let date: chrono::NaiveDate = date.extract()?; // PyDateをchronoのNaiveDateに変換
let next_date = date + chrono::Duration::days(1);
let next_date = next_date.into_pyobject(py)?; // chronoのNativeDateをPyDateに変換
Ok(next_date.into())
}
}
pyfunctionの関数の引数や戻り値として直接chronoの日付を指定することも出来る。
use pyo3::prelude::*;
#[pymodule]
mod example_pyo3 {
use pyo3::{prelude::*, types::*};
〜
#[pyfunction]
fn inc_date(date: chrono::NaiveDate) -> PyResult<chrono::NaiveDate> {
let next_date = date + chrono::Duration::days(1);
Ok(next_date)
}
}