【发布时间】:2020-10-25 20:19:05
【问题描述】:
我试图关注this example 尝试在 C 中创建一个可以在 Python 中使用的简单哈希表(使用 CFFI)。以下是对应的文件和相关代码。
hash_table.h:
typedef struct {
size_t size;
...
int cmp_function(const PyObject*, const PyObject*);
} hash_table_t;
build_hash_table.py:
from cffi import cffi
HEADER_FILE_NAME = "hash_table.h"
SOURCE_FILE_NAME = "hash_table.c"
ffi = FFI()
header = open(HEADER_FILE_NAME, "rt").read()
source = open(SOURCE_FILE_NAME, "rt").read()
ffi.set_source("hashtable.hash_table", header + source)
ffi.cdef(header)
if __name__ = "__main__":
ffi.compile()
现在,到目前为止一切正常。但是,我将要在哈希表中插入任何数据类型。如何访问我在 C 代码中收到的任何对象?例如,假设我在 Python 中有这个类:
class Person():
def __init__(self, name, id):
self.name = name
self.id = id
def __eq__(self, other):
return self.id == other.id
当我在哈希表中搜索Person 对象时,如何访问__eq__ 方法?正如你在上面看到的,我有一个在哈希表中声明为int cmp_function(const void*, const void*); 的通用比较函数。目标是每次搜索对象时,我都可以知道该对象的 __eq__ 方法定义 - 在 C 端。
希望我把我的问题说清楚了,提前谢谢你!
【问题讨论】:
-
你的对象不应该是
void *,而是PyObject *那么... -
它们不应该是常量。无论如何,访问需要 CPython,在 PyPy 等中不起作用...
-
如果我只是将它们用于比较,出于什么原因我不希望它们成为 const?无论哪种方式,我都可以只与 CPython 兼容的代码 - 当然,更便携的选项也很高兴:)
标签: c python-3.x python-cffi