This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author rindeal
Recipients MrSurly, rindeal
Date 2021-11-07.14:24:54
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <1636295094.18.0.893080044198.issue43073@roundup.psfhosted.org>
In-reply-to
Content
I have created a workaround, since it might take years to fix this in master. Hope it'll come in useful.


For the example in https://bugs.python.org/issue43073#msg385970, but probably any combination of Unions and BigEndianStructures can be constructed this way.
```
class U_a(ct.BigEndianStructure):
    _pack_ = True
    _fields_ = [('a', ct.c_int)]

class U_b(ct.BigEndianStructure):
    _pack_ = True
    _fields_ = [('b', ct.c_int)]

class U(ct.Union):
    _pack_ = True
    _fields_ = [
        ('_a', U_a),
        ('_b', U_b),
    ]
    _anonymous_ = ['_a', '_b']

class _S_be_fields_only(ct.Structure):
    _pack_ = True
    _fields_ = [
        ('_x', ct.c_int),
        ('y', U),
    ]
class _S_2be_fields_only(ct.BigEndianStructure):
    _pack_ = True
    _fields_ = [
        ('x', ct.c_int),
        ('_y', ct.c_byte * ct.sizeof(U)),
    ]

class _S_U(ct.Union):
    _pack_ = True
    _fields_ = [
        ('_be_fields_only', _S_be_fields_only),
        ('_2be_fields_only', _S_2be_fields_only),
    ]
    _anonymous_ = [f[0] for f in _fields_]

class S(ct.Structure):
    _pack_ = True
    _fields_ = [('_s_u', _S_U)]
    _anonymous_ = [_fields_[0][0]]


issubclass(S, ct.Structure) == True
s = S(x=0x11223344, y=U(a=0xaabbccdd))
s.y.a == s.y.b
bytes(s).hex() == "11223344aabbccdd"
```
History
Date User Action Args
2021-11-07 14:24:54rindealsetrecipients: + rindeal, MrSurly
2021-11-07 14:24:54rindealsetmessageid: <1636295094.18.0.893080044198.issue43073@roundup.psfhosted.org>
2021-11-07 14:24:54rindeallinkissue43073 messages
2021-11-07 14:24:54rindealcreate