2016-11-08 1 views
1

이것은 #1228158 또는 #28879604과 다릅니다. 그것은 비슷하지만 비틀어졌습니다. 원하는 경우,간접적으로 재귀 ctypes.Structure 형식을 만들 수 있습니까?

A = type('A', (ctypes.Structure,), {}) 
A._fields_ = [('another_a', ctypes.POINTER(A))] 

또는 :

그것은 자신의 유형을 참조 재귀 유형을 만들 사소한

class A(ctypes.Structure): 
    pass 
A._fields_ = [('another_a', ctypes.POINTER(A))] 

같은 일이. 그들이 똑같은 것이 아니라면, 나를 교육 시켜라!

하지만 에 C structtypedef을 번역하려고합니다. 파이썬 측의 이름과 관계가 C 측의 이름과 관계를 반영하기를 바랍니다. 만약 어떤 함수가 typedefconsumer_iduint32을 반환한다면, 파이썬 측의 객체가 좀 더 기술적 인 이름을 가지길 원합니다. 자, 여기 꽤 자주 발생하는 일의 종류는 다음과 같습니다

typedef dummy_type official_type; 
typedef struct dummy_struct { 
    official_type *another_struct; 
} dummy_type; 

은 아무리 비틀이를 설정하는 방법, 파이썬에서이 관계를 인식 할 수 없습니다. 중간 이름은 일 것입니다. 어쨌든은 사용되지 않으므로,이 상황을 감지하고 official_typectypes.Structure이라고 지칭합니다. 그리고 dummy_typestruct dummy_struct 유형을 자체로 참조하십시오. C의 바이너리 레벨에서는 모두 동등합니다.

하지만 제가 정말하고 싶은 것은 이것이다 : 물론

Struct_dummy_struct = type('struct_dummy_struct', (ctypes.Structure,), {}) 
Dummy_type = type('dummy_type', (Struct_dummy_struct,), {}) 
Official_type = type('official_type', (Dummy_type,), {}) 
Struct_dummy_struct._fields_ = [('another_struct', ctypes.POINTER(Official_type))] 

이 수 없습니다 :

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: _fields_ is final 

나는 내가 할 노력하고있어 것은 주어진 이론적으로 불가능하다 생각 방법은 ctypes입니다,하지만 누군가가 저에게 방법이 있다고 말할 수 있다면, 나는 기뻐할 것입니다!

답변

0

당신은 파이썬에서 동일한 구성이 필요하지 않습니다 :

class official_type(ctypes.Structure): 
    pass 
official_type._fields_ = [("another_struct", ctypes.POINTER(official_type))] 
first_instance = official_type() 
second_instance = official_type() 
first_instance.another_struct = ctypes.pointer(second_instance) 
print first_instance.another_struct 

<__main__.LP_official_type object at ...>

하는 ctypes가 펑키 구조체 마무리 공정을 가지고, 당신은 단위 테스트에 파고 경우 같은 것을 찾을 수 있습니다 :

구조/연합 수업은 조만간 다음 중 하나가 발생하면 '완료'되어야합니다.

  1. _fields_가 설정됩니다.
  2. 인스턴스가 생성됩니다.
  3. 유형이 다른 구조/연합의 필드로 사용됩니다.
  4. 유형은, 그들이 확정

을 서브 클래스되지 않습니다 필드를 할당하는 것은 더 이상 허용됩니다.

아마도 클래스 정의 사용 유형은 프로세스를 엉망으로 만듭니다.

+0

내 폴백은 똑같은 형식 구조를 복사하지 않는 것이지만, 예기치 않은 방식이 가능한지 궁금합니다. 필자의 예제 코드가 (이해할 수있는 한!) 작동하지 않는다는 이유는 타입이 상속 된 후에'_fields_'를 만지기 때문이다. 만약 내가'class'를 사용한다면, 같은 일이 일어날 것입니다. – clacke

+0

구조체> A> B> B에 대해 _fields_를 설정할 때이 문제가 발생했습니다. 그것은 A에서 B로 subbing 할 때 이미 마무리되었지만 Structure에서 A로 subbing하는 동안에는 끝내지 않았습니다. 구조를 서브 클래 싱하는 것은 직접 마무리하지 않는 특별한 경우입니다. – vriesdemichael

+0

구조체는 템플릿 클래스로 동작하므로 하위 클래스가'_fields_'를 쳤을 때 "마법"으로 작동합니다. 그러나 당신의 경우가 잘못되어서 틀린 것이 틀림 없다. 어쩌면 당신은'B'로 서브 클래 싱을 한 후에'A'에'_fields_'를 설정하려고했을 것입니다. – clacke

관련 문제