在枚举模块存在之前,c_int或相关类型通常用作替代枚举.但这没有也没有检查类型.
现在python有一个枚举模块,有没有办法直接使用ctypes?
最佳答案 是的,我们可以轻松创建自己的CEnum类,这要归功于ctypes允许我们选择使用自定义类.枚举类型由ctypes自动检查.
from ctypes import windll
from enum import IntEnum
class CEnum(IntEnum):
@classmethod
def from_param(cls, self):
if not isinstance(self, cls):
raise TypeError
return self
class EnumA(CEnum):
CONST = 0
class EnumB(CEnum):
CONST = 0
这是一个示例(滥用类型,但正确显示使用情况):
windll.kernel32.GetModuleHandleA.argtypes = [EnumA]
>>> windll.kernel32.GetModuleHandleA(EnumA.CONST)
>>> windll.kernel32.GetModuleHandleA(EnumB.CONST)
ArgumentError: argument 1: <class 'TypeError'>:
顺便说一下,我已经切换到cffi,它本身支持枚举,并使用c定义,与其ctype对应物相比恰好更简洁.