Python 3.x PyCharm建议/使用ctypes结构和联合完成
最近,我在寻找一种方便的方法来定义Python中的位字段,它的工作方式与C中的类似。我需要它来处理各种硬件组件中的寄存器,但这并不重要。 经过一些研究,我没有找到任何适合我需要的东西,最终使用ctypes结构和联合创建了我自己的代码。下面您可以看到类定义和使用示例Python 3.x PyCharm建议/使用ctypes结构和联合完成,python-3.x,pycharm,structure,union,bit-fields,Python 3.x,Pycharm,Structure,Union,Bit Fields,最近,我在寻找一种方便的方法来定义Python中的位字段,它的工作方式与C中的类似。我需要它来处理各种硬件组件中的寄存器,但这并不重要。 经过一些研究,我没有找到任何适合我需要的东西,最终使用ctypes结构和联合创建了我自己的代码。下面您可以看到类定义和使用示例 # register class in question class register(): def __init__(self, reg_address, reg_fields): Reg_fields =
# register class in question
class register():
def __init__(self, reg_address, reg_fields):
Reg_fields = type('Reg_fields', (ctypes.Structure,), {"_fields_": reg_fields})
Reg = type('reg', (ctypes.Union,), {"_fields_": [("f", Reg_fields), ("dword", c_uint32)]})
self.address = reg_address
self.val = Reg()
# example class for HW component register set
class HW_component_example:
def __init__(self, base_addr):
# example register declaration
reg_fields = [
("ptrn_length", c_uint32, 8), # bit7..0
("bf_length", c_uint32, 8), # bit15..8
("buf_a_addr_clr", c_uint32, 1), # bit16
("buf_b_addr_clr", c_uint32, 1), # bit17
("buf_c_addr_clr", c_uint32, 1), # bit18
("buf_d_addr_clr", c_uint32, 1), # bit19
("reserved", c_uint32, 10), # bit29..20
("dmpr_restart", c_uint32, 1), # bit30
("ce_enable", c_uint32, 1), ] # bit31
self.reg1 = register(base_addr + 0x014, reg_fields)
# component declaration
HW_object = HW_component_example(0x00091000)
# usage example - register field access (a chunk of 32bit value)
HW_object.reg1.val.f.bf_length = 16
# usage example - full register value access
HW_object.reg1.val.dword = 0x12345678
这项工作做得很好,没有任何问题。我面临的问题实际上是PyCharm。它拒绝完成来自结构和联合体的项目。我发现这个线程指出这是一些IDE(包括PyCharm)中的一个问题,甚至建议使用super()方法解决这个问题,如下所示:
import ctypes
from ctypes import *
class MY_STRUCTURE(ctypes.Structure):
def __init__(self):
self.member1 = 1
self.member2 = 2
super().__init__(member1=self.member1,
member2=self.member2)
_fields_ = [("member1", c_int),
("member2", c_int)]
这很好,但问题是我的类是由一个参数“reg_fields”动态定义的。因此,我真的不知道如何将这两种类定义方式结合起来。我愿意接受关于让PyCharm完成这些项的其他方法的建议,甚至是关于此类位字段的其他方法(但仅限于不需要位移位、掩蔽和所有其他位操作的建议;-))