Я пытаюсь создать класс битового поля, используя ctypes в IronPython 2.7.9.Я пытаюсь пример в этом ответе .но он не работает с SystemError: Object reference not set to an instance of an object
в строке flags.asbyte = 0xc
при доступе к члену Union.
Я также попытался указать на CPython stdlib, как предлагалось в этом сообщении , добавивПуть к CPython 2.7.8, но это тоже не сработало.
import sys
sys.path.append("C:/Python27/DLLs")
import ctypes
c_uint8 = ctypes.c_uint8
class Flags_bits(ctypes.LittleEndianStructure):
_fields_ = [
("logout", c_uint8, 1),
("userswitch", c_uint8, 1),
("suspend", c_uint8, 1),
("idle", c_uint8, 1),
]
class Flags(ctypes.Union):
_fields_ = [("b", Flags_bits),
("asbyte", c_uint8)]
flags = Flags()
flags.asbyte = 0xc
print(flags.b.idle)
print(flags.b.suspend)
print(flags.b.userswitch)
print(flags.b.logout)
Пример ctypes на IronPython? может быть интересным, но принятый ответ не является примером.
РЕДАКТИРОВАТЬ: Я копнул немного дальше, и этот код (вдохновленный из этого модульного теста ) не работает:
from ctypes import *
class ANON(Union):
_fields_ = [("a", c_int),
("b", c_int)]
a = ANON()
a.a = 5
Хотя этот кусок кода ( из этого модульного теста ) работает:
from ctypes import *
class X(Structure):
_fields_ = [("a", c_longlong, 1),
("b", c_longlong, 62),
("c", c_longlong, 1)]
x = X()
x.a, x.b, x.c = -1, 7, -1
Так что похоже на ограничение IronPython
Спасибо!