4
enum
모듈이 존재하기 전에 c_int
또는 관련 유형이 대개 대체 열거 형으로 사용되었습니다. 그러나 이것은 유형이 없거나 검사하지 않았습니다.ctypes 용 파이썬 열거 형 모듈 사용
이제 파이썬에는 enum
모듈이 있습니다. ctypes
과 함께 직접 사용할 수있는 방법이 있습니까?
enum
모듈이 존재하기 전에 c_int
또는 관련 유형이 대개 대체 열거 형으로 사용되었습니다. 그러나 이것은 유형이 없거나 검사하지 않았습니다.ctypes 용 파이썬 열거 형 모듈 사용
이제 파이썬에는 enum
모듈이 있습니다. ctypes
과 함께 직접 사용할 수있는 방법이 있습니까?
예, 우리는 ctypes 덕분에 우리 고유의 CEnum 클래스를 쉽게 만들 수 있습니다. 이는 사용자 정의 클래스를 사용할 수있는 옵션을 제공합니다. 열거 유형은 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'>:
, I는 열거를 기본적으로 지원하고, 사용하는, cffi 전환 이후했습니다 c 정의는 ctype 대응에 비해 훨씬 더 간결합니다.
Python 3.4.1에서 코드를 실행할 때 'ValueError'가 표시되지 않습니다. 또한 표시된 오류 메시지가 이상하게 보일 것입니다.'ValueError : 0은 (는) 유효한 EnumA가 아닙니다 '? – martineau
@eryksun 흠, 어떻게 된 일인지 잘 모르겠습니다. – simonzack
유감스럽게도'ctypes.Structure' 정의에서 C 타입으로'CEnum' 서브 클래스를 사용할 수 없습니다. 나는 이것을 위해 새로운 [question] (http://stackoverflow.com/questions/36877391/using-an-intenum-as-the-type-in-a-ctypes-structure-fields)을 만들었다. –