gpt4 book ai didi

python - 将底层结构公开为 Python 扩展中自定义类型的成员

转载 作者:太空狗 更新时间:2023-10-30 01:30:16 31 4
gpt4 key购买 nike

这个问题是对上一个问题的轻微旋转:Accessing the underlying struct of a PyObject

除了在我的版本中,我想知道如何将 Point 结构的字段公开为我的新类型的成员。

我到处寻找我能想到的地方,阅读了大量示例 Python 扩展并阅读了许多教程、文档等,但未能找到一种干净的方法来执行此操作。

下面是我想做的一个例子。我有一些我想通过 Python 扩展公开的内部结构,但我不想在我的代码中重新定义该结构。似乎问题的主要区域是 PyMemeberDef 定义......从 PointObject 结构的上下文来看,Point 结构内的 x 或 y 的偏移量是多少?

非常感谢任何帮助,谢谢。

#include <Python.h>
#include <structmember.h>

// This is actually defined elsewhere in someone else's code.
struct Point {
int x;
int y;
};

struct PointObject {
PyObject_HEAD
struct Point* my_point;
int z;
};

static PyMemberDef point_members[] = {
{"z", T_INT, offsetof(struct PointObject, z), 0, "z field"},
{"x", T_INT, offsetof(???), 0, "point x field"},
{"y", T_INT, offsetof(???), 0, "point y field"},
{NULL}
};

static PyTypeObject PointType = {
PyObject_HEAD_INIT(NULL)
.tp_name = "Point",
.tp_basicsize = sizeof(PointObject),
.tp_flags = Py_TPFLAGS_DEFAULT,
.tp_doc = "Point objects",
.tp_members = point_members,
.tp_init = (initproc)point_init,
};

...

PyMODINIT_FUNC
initMainModule(void)
{
PyObject *m = Py_InitModule(MODULE, NULL);

// Register PointType
PointType.tp_new = PyType_GenericNew;
if (PyType_Ready(&PointType) < 0)
return;
Py_INCREF(&PointType);
PyModule_AddObject(m, "Point", (PyObject *)&PointType);

...
}

最佳答案

我强烈推荐阅读 http://docs.python.org/release/2.6/_sources/extending/newtypes.txt ,特别是有关“提供对数据属性的更精细控制”的部分。

阅读本文后,似乎可以通过为 Point 结构中的特定成员定义一组 setter/getter 来实现这一点。对于像这样简单的事情,它似乎有点矫枉过正,但它似乎工作得很好。

下面是一个关于如何为 Point 的“x”字段执行此操作的示例,基于将以下代码添加到我之前的示例中:

static PyGetSetDef point_getset[] = {
{"x", (getter)point_get_x, (setter)point_set_x, "", NULL},
{NULL}
};

static PyObject*
point_get_x(struct PointObject *self, void *closure)
{
return Py_BuildValue("i", self->my_point->x);
}

static int
point_set_x(struct PointObject *self, PyObject *value, void *closure)
{
PyErr_SetString(PyExc_TypeError, "Attribute is read-only!");
return -1;
}

最后,将 point_getset 结构添加到先前定义的 PyTypeObject 结构中的 tp_getset 字段。应该注意的是,对于简单的情况,您仍然可以在传统的 PyMemberDef 结构中定义成员。

关于python - 将底层结构公开为 Python 扩展中自定义类型的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7043432/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com