小编Les*_*ieK的帖子

python 3.3 dict:如何将struct PyDictKeysObject转换为python类?

我正在尝试修改Brandon Rhodes代码例程,它检查CPython字典的内部,以便它适用于CPython 3.3.

我相信我已成功翻译了这个结构.

typedef PyDictKeyEntry *(*dict_lookup_func)
    (PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject ***value_addr);

struct _dictkeysobject {
    Py_ssize_t dk_refcnt;
    Py_ssize_t dk_size;
    dict_lookup_func dk_lookup;
    Py_ssize_t dk_usable;
    PyDictKeyEntry dk_entries[1];
};
Run Code Online (Sandbox Code Playgroud)

我认为以下看起来很好:

from ctypes import Structure, c_ulong, POINTER, cast, py_object, CFUNCTYPE

LOOKUPFUNC = CFUNCTYPE(POINTER(PyDictKeyEntry), POINTER(PyDictObject), 
                       py_object, c_ulong, POINTER(POINTER(py_object)))

class PyDictKeysObject(Structure):
"""A key object"""
_fields_ = [
    ('dk_refcnt', c_ssize_t),
    ('dk_size', c_ssize_t),
    ('dk_lookup', LOOKUPFUNC),
    ('dk_usable', c_ssize_t),
    ('dk_entries', PyDictKeyEntry * 1),
]

PyDictKeysObject._dk_entries = PyDictKeysObject.dk_entries
PyDictKeysObject.dk_entries = property(lambda s: 
    cast(s._dk_entries, POINTER(PyDictKeyEntry * s.dk_size))[0]) …
Run Code Online (Sandbox Code Playgroud)

c python dictionary ctypes python-3.x

5
推荐指数
1
解决办法
970
查看次数

标签 统计

c ×1

ctypes ×1

dictionary ×1

python ×1

python-3.x ×1