You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Python C API中如何从PyDate对象减去PyDelta对象

在Python C扩展中实现PyDate减去PyDelta的操作

你不需要直接调用_datetimemodule.c里的内部方法(那些是未暴露的私有实现,没法通过公共头文件引用),直接用Python提供的公共C API就能完成PyDate和PyDelta的减法操作,有两种常用方式:

方法一:使用通用减法API PyObject_Subtract

这是Python C API提供的通用对象减法函数,会自动调用对象的__sub__方法,代码示例:

#include <datetime.h>
#include <Python.h>

// 假设你已经创建了first_date和time_delta对象
PyObject *result_date = PyObject_Subtract(first_date, time_delta);
if (result_date == NULL) {
    // 处理错误:比如类型不匹配、减法操作失败等
    // 可通过PyErr_Occurred()获取具体异常信息
    return NULL;
}

// 使用result_date进行后续操作...

// 记得用完后释放对象引用
Py_DECREF(result_date);

方法二:直接调用PyDate的__sub__方法

如果你想更明确地调用日期对象的减法方法,可以手动获取__sub__属性并调用:

// 获取first_date的__sub__方法
PyObject *sub_method = PyObject_GetAttrString(first_date, "__sub__");
if (sub_method == NULL) {
    return NULL;
}

// 调用__sub__方法,传入time_delta作为参数
PyObject *result_date = PyObject_CallFunctionObjArgs(sub_method, time_delta, NULL);
Py_DECREF(sub_method); // 用完方法对象后立即释放

if (result_date == NULL) {
    // 处理错误
    return NULL;
}

// 使用result_date...

Py_DECREF(result_date);

关键提醒

  • 这两种方式都依赖Python的公共API,跨版本兼容,避免了直接依赖内部私有实现的风险。
  • 所有通过API创建或获取的PyObject对象,在不再使用时必须调用Py_DECREF释放引用,防止内存泄漏。
  • 如果减法操作失败(比如传入的不是合法的PyDelta对象),API会返回NULL并设置Python异常,你需要在代码中处理这些错误场景。

内容的提问来源于stack exchange,提问作者Michael Matsaev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 16:57:31