Python C api - 函数重载

2024-04-29

我有许多接受不同参数的 C 函数,例如

foo_i(int a)

foo_c(char c)

是否可以在 python C api 中重载这些函数?

我尝试使用以下方法表:

static PyMethodDef test_methods[] = {
    {"foo", (PyCFunction)foo_i, METH_VARARGS, "int"},
    {"foo", (PyCFunction)foo_c, METH_VARARGS, "char"},
    {NULL, NULL, 0, NULL}
};

但是当我调用foo从Python我总是最终使用表底部的函数。

关于如何调用两者的任何想法foo_i() and foo_c() using foo()在 python C-api 中?

Thanks!


要么给它们不同的 Python 级别名称,要么编写一个包装函数,对提供的参数进行类型检查并分派到正确的“真实”函数。 Python 本身不直接支持基于参数类型的重载函数。

如果您想要为您编写的包装,您可以看看pybind11,它确实允许您尝试的意义上的重载(它通过引擎盖下的类型检查包装器来实现,所以它只是语法糖,而不是行为的改变)。

未经测试的示例代码:

static PyObject*
foo_wrapper(PyObject *self, PyObject *arg)
{
    Py_buffer view;
    Py_ssize_t ival;

    // Check for/handle length 1 bytes-like object (bytes, bytearray, small mmap, etc.)
    if (PyObject_GetBuffer(arg, &view, PyBUF_SIMPLE) == 0) {
        if (view.len != 1) {
             PyErr_Format(PyExc_ValueError, "Must receive exactly one byte, got %zd", view.len);
             PyBuffer_Release(&view);
             return NULL;
        }
        foo_c(((char*)view.buf)[0]);
        Py_RETURN_NONE; // Or convert return from foo_c if it exists
    }

    // Check for/handle integer-like object that fits in C int
    PyErr_Clear(); // Ignore error for objects not supporting buffer protocol
    ival = PyNumber_AsSsize_t(arg, PyExc_ValueError);
    if (PyErr_Occurred()) {
        if (PyErr_ExceptionMatches(PyExc_TypeError)) {
            // Replace with general error message about both accepted argument types,
            // since only reporting error from int conversion might confuse folks
            PyErr_Format(PyExc_TypeError, "Argument must be length 1 bytes-like object or integer; received %R", Py_TYPE(arg));
        }
        return NULL;
    }

    // Check valid range (Py_ssize_t often larger than int)
    if (ival < INT_MIN or ival > INT_MAX) {
        return PyErr_Format(PyExc_ValueError, "Integer must be in range [%d-%d]; received %zd", INT_MIN, INT_MAX, ival);
    }

    foo_i((int)ival);
    Py_RETURN_NONE; // Or convert return from foo_i if it exists
}

static PyMethodDef test_methods[] = {
    {"foo", (PyCFunction)foo_wrapper, METH_O, "Wrapper for foo_c and foo_i"},
    {NULL, NULL, 0, NULL}
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python C api - 函数重载 的相关文章

随机推荐

  • 如何在 NSBundle 中从 Assets.car(xcassets 的编译版本)加载图像? (不使用 CocoaPods)

    我们收到以下类型的错误消息 无法加载从标识符为 com company OurResourceBundle 的包中的笔尖引用的 iconStatus 图像 基本上 我们将一堆图像放在 xcassets 文件夹中 适用于非捆绑加载的情况 xc
  • 使用 NSJSONSerialization 解析 JSON:错误 3840 - 数据损坏?

    我读过很多关于这个问题的问答 但找不到适合我情况的答案 我从用 PHP 创建的 REST 服务检索 JSON 响应 这是我的代码 NSURLResponse response nil NSError theError1 nil NSErro
  • 需要一种方法来防止不需要的作业参数传播到 Spring Boot 批处理作业的下一次执行

    我正在使用 Spring Boot 2 1 2 和 Spring Batch 4 1 1 运行批处理应用程序 该应用程序使用 MySQL 数据库作为 Spring Batch 元数据数据源 首先 我使用以下命令运行作业 java jar t
  • 随机数列表 - arc4random

    我想创建一个 0 9 的数字数组并希望它们是随机的 意思是 当用户单击 UIButton 时 它会创建一个由对象 4 5 8 3 6 2 9 1 7 0 组成的 NSMutableArray 当用户再次单击该按钮时 它会生成另一个 0 9
  • 自动将 Linux 文件名重命名为 Windows 中合法的新文件名

    我想将 linux 文件重命名为在 windows 中合法的文件名 它的长度不应超过允许的长度 并且不应包含 Windows 中不允许的字符 有时我将论文的标题复制到文件名 它们有特殊字符 例如 or 另外 从 pdf 中复制和粘贴标题时
  • 如何在highcharts中设置动态数据

    我正在从 servlet 获取数据 我从 servlet 发送的 json 对象的 sysout 是 jsonArray bugzilla 20 redmind 14 现在我的java脚本是
  • 单击“提交”按钮时禁用中继器中的选中复选框

    我想在用户单击 ASP NET 中的 提交 按钮时禁用选中的复选框 我可以使用 JavaScript 使用按钮的 onclick 事件禁用复选框 这些复选框位于中继器中 通过单击 提交 按钮提交表单时 代码隐藏按钮单击代码中没有任何复选框显
  • Doxygen 在子目录中找不到标头

    我正在使用 Doxygen 记录 C 库的头文件 在里面Doxyfile 我定义 INPUT include 希望 Doxygen 能够为所有头文件生成文档include Foo 但事实并非如此 只有index html被生成 我可以设置I
  • 绘制从节点到空的箭头

    我想绘制一个美人鱼图 其中包含不与节点连接的箭头 graph LR A Sample Text gt A A gt B B gt A B gt gt A and B gt 失败 可能是因为箭头需要输入和输出节点 有解决方法吗 我可以使节点不
  • 设置样式缩放级别 openlayers 3

    在 Openlayers 中 可以根据缩放级别打开或关闭某些功能 尽管查看了文档 但我在 OpenLayers 3 中没有找到相同的功能 有谁知道如何做到这一点 这是我放置在地图上的功能ol style Text是我只想在用户放大到特定缩放
  • 运算符“&&”不能应用于“bool”和“System.Collections.Generic.IEnumerable”类型的操作数

    我正在尝试第一个过滤器列表 然后使用OrderBy但我收到以下错误Where clause 运算符 不能应用于 bool 类型的操作数并且 System Collections Generic IEnumerable 我的查询有什么问题吗
  • 使用 javascript 打开文件,客户端

    在我的应用程序中 我想打开客户端计算机上存在的文件 我创建了两个应用程序 桌面应用程序和 Web 应用程序 当用户安装桌面应用程序时 一些文件会被复制到其安装路径 我想通过 javascript 从我的 Web 应用程序打开这些文件 出于安
  • AngularJS:使用 $http.post 传递复杂的 json 数据

    我在使用 http post 在 angularjs 中传递复杂的 json 对象时遇到问题 我不断收到从服务器发回的 400 bad request 错误 表示该请求在语法上不正确 我相信它与数组有关 因为当我不包含它时它会很好地传递 我
  • 直接放置在 std::map 中

    为什么这段代码无法编译 std map
  • 有没有办法使用 iframe api 在暂停时隐藏相关的 Youtube 视频?

    我正在使用 iframe API 我想在页面上嵌入一些视频 但我不想在用户暂停视频时显示相关视频 我知道 2018 年 9 月之后 Youtube 取消了在结束或暂停视频时隐藏相关视频的可能性 我知道参数 rel 0 现在显示来自视频上传者
  • Android 检测 Kitkat 的 USB 存储 (4.4)

    我创建了一个 webview 应用程序 它在资产目录中的应用程序内托管一个网站 我想通过插入我的平板电脑 USB 插槽的 U 盘来更新网站 我首先尝试使用 MEDIA MOUNTED 广播 该广播不适用于我的 android 4 4 药片
  • Android SQLite 列.....不是唯一的

    我在 Android 上使用 SQLite 并收到此错误 02 11 18 05 37 224 E SQLiteDatabase 26583 android database sqlite SQLiteConstraintException
  • 添加覆盖 twinx 轴线条的图例

    我有这个Python代码 它与轴成对ax并在两个轴上绘制一些函数 我将图例绘制在ax1 问题是图例没有覆盖曲线ax2 有可能自动定位传说中的ax通过覆盖线ax2 请注意 在fig legend选项loc best 不可用 我需要在绘图区域内
  • 最长和最短的 HTML 字符实体名称是什么? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 管子周围有
  • Python C api - 函数重载

    我有许多接受不同参数的 C 函数 例如 foo i int a foo c char c 是否可以在 python C api 中重载这些函数 我尝试使用以下方法表 static PyMethodDef test methods foo P