2014-11-29 3 views
4

enum 모듈이 존재하기 전에 c_int 또는 관련 유형이 대개 대체 열거 형으로 사용되었습니다. 그러나 이것은 유형이 없거나 검사하지 않았습니다.ctypes 용 파이썬 열거 형 모듈 사용

이제 파이썬에는 enum 모듈이 있습니다. ctypes과 함께 직접 사용할 수있는 방법이 있습니까?

답변

2

예, 우리는 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 대응에 비해 훨씬 더 간결합니다.

+0

Python 3.4.1에서 코드를 실행할 때 'ValueError'가 표시되지 않습니다. 또한 표시된 오류 메시지가 이상하게 보일 것입니다.'ValueError : 0은 (는) 유효한 EnumA가 아닙니다 '? – martineau

+0

@eryksun 흠, 어떻게 된 일인지 잘 모르겠습니다. – simonzack

+0

유감스럽게도'ctypes.Structure' 정의에서 C 타입으로'CEnum' 서브 클래스를 사용할 수 없습니다. 나는 이것을 위해 새로운 [question] (http://stackoverflow.com/questions/36877391/using-an-intenum-as-the-type-in-a-ctypes-structure-fields)을 만들었다. –