gpt4 book ai didi

python - ctypes可变长度结构

转载 作者:太空狗 更新时间:2023-10-29 17:28:58 27 4
gpt4 key购买 nike

自从我读了 Dave Beazley 关于二进制 I/O 处理的文章 (http://dabeaz.blogspot.com/2009/08/python-binary-io-handling.html),我就想创建一个 Python 库对于某种有线协议(protocol)。但是,我找不到可变长度结构的最佳解决方案。这是我想要做的:

import ctypes as c

class Point(c.Structure):
_fields_ = [
('x',c.c_double),
('y',c.c_double),
('z',c.c_double)
]

class Points(c.Structure):
_fields_ = [
('num_points', c.c_uint32),
('points', Point*num_points) # num_points not yet defined!
]

Points 将不起作用,因为 num_points 尚未定义。一旦 num_points 已知,我可以稍后重新定义 _fields_ 变量,但由于它是一个类变量,它将影响所有其他 Points 实例。

这个问题的 pythonic 解决方案是什么?

最佳答案

以您给出的示例为例,最直接的方法是在您拥有所需信息时定义结构。

一个简单的方法是在您将要使用它的地方创建类,而不是在模块根目录 - 例如,您可以将 class 主体放在一个函数中,这将充当工厂 - 我认为这是最易读的方式。

import ctypes as c



class Point(c.Structure):
_fields_ = [
('x',c.c_double),
('y',c.c_double),
('z',c.c_double)
]

def points_factory(num_points):
class Points(c.Structure):
_fields_ = [
('num_points', c.c_uint32),
('points', Point*num_points)
]
return Points

#and when you need it in the code:
Points = points_factory(5)

对不起-C 代码将为您“填写”这些值——这不是它们的答案。将以其他方式发布。

关于python - ctypes可变长度结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7015487/

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