Python 是否可以创建间接递归的ctypes.Structure类型?

Python 是否可以创建间接递归的ctypes.Structure类型?,python,ctypes,Python,Ctypes,这与或不同。这很相似,但有点扭曲 创建引用其自身类型的递归类型非常简单: A = type('A', (ctypes.Structure,), {}) A._fields_ = [('another_a', ctypes.POINTER(A))] 或者,如果您愿意: class A(ctypes.Structure): pass A._fields_ = [('another_a', ctypes.POINTER(A))] 同样的事情。如果他们不是一回事,一定要教育我 但是我正在尝试

这与或不同。这很相似,但有点扭曲

创建引用其自身类型的递归类型非常简单:

A = type('A', (ctypes.Structure,), {})
A._fields_ = [('another_a', ctypes.POINTER(A))]
或者,如果您愿意:

class A(ctypes.Structure):
    pass
A._fields_ = [('another_a', ctypes.POINTER(A))]
同样的事情。如果他们不是一回事,一定要教育我

但是我正在尝试将C
struct
s和
typedef
s机器翻译成
ctypes.Structure
s。我希望Python端的名称和关系能够反映C端的名称和关系。如果函数返回
uint32
,即
typedef
ed为
consumer\u id
,我希望Python端的对象具有更具描述性的名称。现在,有一种事情经常发生:

typedef dummy_type official_type;
typedef struct dummy_struct {
    official_type *another_struct;
} dummy_type;
无论我如何扭曲和扭转它,我都无法在Python中实现这种关系。中间名称可能不会在任何地方使用,因此目前我们的想法是检测这种情况,并仅使
官方_type
a
ctypes.Structure
引用自身。并且可能使
dummy\u type
struct dummy\u struct
类型引用自身。在二进制级别上,在C端,它们都是等价的

但我真正想做的是:

Struct_dummy_struct = type('struct_dummy_struct', (ctypes.Structure,), {})
Dummy_type = type('dummy_type', (Struct_dummy_struct,), {})
Official_type = type('official_type', (Dummy_type,), {})
Struct_dummy_struct._fields_ = [('another_struct', ctypes.POINTER(Official_type))]
当然,这是不可能的:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: _fields_ is final
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
AttributeError:_fields_u为最终属性

考虑到
ctypes
的工作方式,我认为我试图做的理论上是不可能的,但是如果有人能告诉我有一种方法,我会很高兴

在python中不需要相同的构造:

class official_type(ctypes.Structure):
    pass
official_type._fields_ = [("another_struct", ctypes.POINTER(official_type))]
first_instance = official_type()
second_instance = official_type()
first_instance.another_struct = ctypes.pointer(second_instance)
print first_instance.another_struct

Ctypes有一个时髦的结构终结过程,如果深入研究单元测试,您会发现如下内容:

当发生以下情况之一时,结构/联合类迟早必须“最终确定”:

  • _已设置字段
  • 创建一个实例
  • 该类型用作另一个结构/联合的字段
  • 类型是子类的
  • 最终确定后,不再允许分配字段


    可能您使用类型定义的类会使过程变得混乱。

    您不需要在python中使用相同的构造:

    class official_type(ctypes.Structure):
        pass
    official_type._fields_ = [("another_struct", ctypes.POINTER(official_type))]
    first_instance = official_type()
    second_instance = official_type()
    first_instance.another_struct = ctypes.pointer(second_instance)
    print first_instance.another_struct
    

    Ctypes有一个时髦的结构终结过程,如果深入研究单元测试,您会发现如下内容:

    当发生以下情况之一时,结构/联合类迟早必须“最终确定”:

  • _已设置字段
  • 创建一个实例
  • 该类型用作另一个结构/联合的字段
  • 类型是子类的
  • 最终确定后,不再允许分配字段


    也许您使用类型定义的类会把过程搞砸。

    我的退路是不复制完全相同的类型结构,但我很好奇是否有某种意想不到的方式可以做到这一点。我的示例代码无法(据我所知!)工作的原因是,正如您所注意到的,我在继承类型之后正在触摸
    \u字段。如果我使用的是
    class
    ,同样的情况也会发生。我在尝试
    Structure>A>B>为B
    设置字段时遇到了这个问题。它已经完成了从A到B的子类化,但不是从结构到A的子类化。我的猜测是,子类化结构是一种特殊情况,它不会直接完成它。我的印象是,结构就像一个模板类,当你戳
    \u字段时,它使子类发挥“魔力”。但是您的案例发生错误的方式肯定不同,可能您的意思是,在子类化到
    B
    之后,您试图为
    A
    设置
    \u字段。\ucTypes模块只是一个非常薄的包装器。巧合的是,我用这样一个神奇的模板类解决了我的问题。将此标记为答案,因为答案似乎是“事实上,你所要求的在理论上是不可能的。”——)我的退路是不复制完全相同的类型结构,但我很好奇是否有某种意想不到的方式可以做到这一点。我的示例代码无法(据我所知!)工作的原因是,正如您所注意到的,我在继承类型之后正在触摸
    \u字段。如果我使用的是
    class
    ,同样的情况也会发生。我在尝试
    Structure>A>B>为B
    设置字段时遇到了这个问题。它已经完成了从A到B的子类化,但不是从结构到A的子类化。我的猜测是,子类化结构是一种特殊情况,它不会直接完成它。我的印象是,结构就像一个模板类,当你戳
    \u字段时,它使子类发挥“魔力”。但是您的案例发生错误的方式肯定不同,可能您的意思是,在子类化到
    B
    之后,您试图为
    A
    设置
    \u字段。\ucTypes模块只是一个非常薄的包装器。巧合的是,我用这样一个神奇的模板类解决了我的问题。将此标记为答案,因为答案似乎是“事实上,你所要求的在理论上是不可能的。”——)