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))]
同样的事情。如果他们不是一回事,一定要教育我
但是我正在尝试将Cstruct
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
actypes.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模块只是一个非常薄的包装器。巧合的是,我用这样一个神奇的模板类解决了我的问题。将此标记为答案,因为答案似乎是“事实上,你所要求的在理论上是不可能的。”——)