python - 将额外的 void* 与 C 回调一起传递是标准做法吗

标签 python c binding callback

我需要帮助说服第 3 方软件供应商更改他们的 API 以将一些用户数据传递给回调。

这似乎是一种标准做法,因为我经常在使用回调的地方看到它。 我正在寻找一些弹药给他们的开发团队来说服他们这样做。

我的理由是我已经为他们的所有 API 调用创建了 1:1 的 Python 绑定(bind)(接受回调的调用除外)。 如果他们的 API 也为用户数据取了一个 void*...例如:

SOME_API_register_function(char* name, char* desc, void* callback, void* user_data);

而不是...

SOME_API_register_function(char* name, char* desc, void* callback);

这将使我更容易(甚至可能)为这些函数创建绑定(bind)。 我的绑定(bind)目前在 Cython 中,它缺乏动态创建有效 C 回调的能力。 我相信 cffi Python 库提供了这种能力,但这些绑定(bind)的性能有点慢,我担心他们正在做的那种魔法来实现它……我也不想移植我的绑定(bind).

问题是,即使我们向该软件的客户付费,也需要很多时间才能让他们承认错误,更不用说提供新功能了。我拥有的弹药越多越好。 任何说明为用户数据提供 void* 的编程指南、最佳实践等文档都会有所帮助。

最佳答案

user_data字段是需要多次注册同一个函数的。在这种情况下,不同的 user_data 可以区分它们。

这在几种情况下很有用:

  1. 注册与某些对象相关,并且可能有很多对象(例如打开的文件)。您不希望每个打开的文件都有一个单独的函数。

  2. 您想在几个已注册的函数中做基本相同的事情,并且可以用一些值(例如数字常量)来表示差异。在这种情况下,多次注册相同的函数并让 user_data 包含不同的值是很有用的。

附言void *callback 是一个错误的定义。该类型应定义回调的参数和返回类型(最好使用 typedef)。

关于python - 将额外的 void* 与 C 回调一起传递是标准做法吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19482630/

相关文章:

wpf - WPF另一个元素中间的中心元素

c# - 引用未编译的 c# 类

python - 自定义交互式图表中的图例和色标 `altair`

python - 是否有返回节点外边的函数?

python - 如何在 Google Colab 上安装 auto-sklearn?

python - GeoDjango 图层映射和外键

c - 名称无法显示

c - 预处理阶段和多个文件(基础)

将十六进制流复制到字符缓冲区中以通过网络发送

c# - Windows 商店应用程序如何绑定(bind)应用栏项目的可见性?