Python 3.x PyCharm建议/使用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 =

最近,我在寻找一种方便的方法来定义Python中的位字段,它的工作方式与C中的类似。我需要它来处理各种硬件组件中的寄存器,但这并不重要。 经过一些研究,我没有找到任何适合我需要的东西,最终使用ctypes结构和联合创建了我自己的代码。下面您可以看到类定义和使用示例

# 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完成这些项的其他方法的建议,甚至是关于此类位字段的其他方法(但仅限于不需要位移位、掩蔽和所有其他位操作的建议;-))