2010-06-23 2 views
4

파이썬에서 사용하고 싶은 API가 있습니다. 이 API에는 #define으로 구현 된 플래그 및 enum이 포함되어 있습니다.ctypes는 enum 및 플래그에 대해 어떤 것을 제공합니까?

routine(["something", "otherthing"]) 
stuff = getflags() 
if 'something' in stuff 

action('interesting') 
mode = getaction() 
if mode == 'interesting' 

가하는 ctypes는 곧바로이 작업을 수행하는 메커니즘을 제공 하는가 :

// it's just almost C so don't bother adding the typedef and parenthesis diarrhea here. 
routine(API_SOMETHING | API_OTHERTHING) 
stuff = getflags() 
? stuff & API_SOMETHING 

action(API_INTERESTING) 
mode = getaction() 
? mode == INTERESTING 

지금 열거 및 플래그를 제외한 다른 모든 것들을 무시하고, 내 바인딩이로 번역해야합니까? 그렇지 않다면 파이썬 바인딩에서 플래그와 enum을 다루는 '평소'도구에 대해 이야기하십시오.

답변

4

나는이 질문에 스스로 실망한다. 특히 f * 매뉴얼에서 모두 찾았습니다.

http://docs.python.org/library/ctypes.html#calling-functions-with-your-own-custom-data-types

내가 항목을 포장하지 몇 가지 코드를 작성하는 것, 내 대답을 완료합니다.

from ctypes import CDLL, c_uint, c_char_p 

class Flag(object): 
    flags = [(0x1, 'fun'), (0x2, 'toy')] 
    @classmethod 
    def from_param(cls, data): 
     return c_uint(encode_flags(self.flags, data)) 

libc = CDLL('libc.so.6') 
printf = libc.printf 
printf.argtypes = [c_char_p, Flag] 

printf("hello %d\n", ["fun", "toy"]) 

encode_flags는 멋진 목록을 정수로 변환합니다.

+0

이제는 '문서를 읽었으니'다른 모든 솔루션 외에도 '속성'을 사용할 수 있음을 알고 있습니다. http://docs.python.org/library/ functions.html # property –

3

(열거 형은 일반적으로 부호없는 정수 값입니다) 왜 enum 매개 변수에 c_uint를 사용하지 않는 다음과 같은 매핑을 사용

C에서

:

typedef enum { 
    MY_VAR  = 1, 
    MY_OTHERVAR = 2 
} my_enum_t; 

을 파이썬에서 :

class MyEnum(): 
    __slots__ = ('MY_VAR', 'MY_OTHERVAR') 

    MY_VAR = 1 
    MY_OTHERVAR = 2 


myfunc.argtypes = [c_uint, ...] 

그런 다음 MyEnum 필드를 함수에 전달할 수 있습니다.

열거 형 값에 대한 문자열 표현을 사용하려는 경우 MyEnum 클래스에 dictionary을 사용할 수 있습니다.

+0

예. 이런 식으로 할 수 있습니다. 비록 내가 플래그를 찾고 있어요 -> 텍스트 형태의 번역, 자동화 된 형태로. – Cheery

+0

'__getattr__' 메소드를 오버라이드 (override) 해, 플래그의 텍스트 표현을 돌려 줄 수도, 클래스 내의 정적 캐릭터 라인 변수를 추가로 정의 할 수도 있습니다. –

관련 문제