使用扩展在Python中创建新类型

时间:2015-03-26 18:38:43

标签: python c python-c-api

我已经阅读了文档并根据他们的Noddy示例编写了我自己的示例:

https://docs.python.org/3.4/extending/newtypes.html

这与使用Py_BuildValue()动态构建任意对象有点不同。似乎潜在的假设是有一个C结构支持你想要创建的每个对象实例。

这真的是在Python中创建新对象的唯一(最佳?)方式吗?我希望创建一个新对象并声明成员/类型类似于如何创建元组,列表和字典等。似乎应该可以声明一个新类型,声明成员及其类型,然后插入值所有这些都是逐场的。

我甚至无法使用现有API定义的结构,因为Python对象需要强制PyObject_HEAD字段。我必须定义一个 new C结构,复制从API调用中传回给我的相关元素。它看起来像C端的内存管理级别应该是不必要的。

2 个答案:

答案 0 :(得分:0)

当然,还有另一种在Python中创建类型的方法。也许你已经看过了吗?

class Foo():
    def __init__(self):
        ....

当然,我有点油腻。但是当向Python公开C接口时,让Python脚本完成大部分接口通常是一个好主意;毕竟,编写Python代码比编写CPython绑定代码更快。如果您拥有的基本上是一个不透明的句柄类型和一组在这些句柄上创建/操作的C函数,您可以简单地将这些函数公开为自由函数,并从Python端绑定代码中使用它们。 (您甚至可以在不使用ctypes编写单行CPython绑定代码的情况下执行此操作。)

答案 1 :(得分:-1)

所以,我不是创建一个新类型,而是在阅读以分段方式操作元组,并且在struct sequences.上有一个部分这是我最初想象的那样:

https://docs.python.org/3.4/c-api/tuple.html

它没有新类型提供的所有功能,但是为了将类似结构的对象传递回具有命名属性的调用者,这似乎是一种非常简单的方法。

我很好奇你们有什么想法......