使用python枚举模块进行ctypes

在枚举模块存在之前,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对应物相比恰好更简洁.

点赞