이것은 #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 struct
및 typedef
을 번역하려고합니다. 파이썬 측의 이름과 관계가 C 측의 이름과 관계를 반영하기를 바랍니다. 만약 어떤 함수가 typedef
이 consumer_id
인 uint32
을 반환한다면, 파이썬 측의 객체가 좀 더 기술적 인 이름을 가지길 원합니다. 자, 여기 꽤 자주 발생하는 일의 종류는 다음과 같습니다
typedef dummy_type official_type;
typedef struct dummy_struct {
official_type *another_struct;
} dummy_type;
은 아무리 비틀이를 설정하는 방법, 파이썬에서이 관계를 인식 할 수 없습니다. 중간 이름은
일 것입니다. 어쨌든은 사용되지 않으므로,이 상황을 감지하고
official_type
을
ctypes.Structure
이라고 지칭합니다. 그리고
dummy_type
및
struct 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
입니다,하지만 누군가가 저에게 방법이 있다고 말할 수 있다면, 나는 기뻐할 것입니다!
내 폴백은 똑같은 형식 구조를 복사하지 않는 것이지만, 예기치 않은 방식이 가능한지 궁금합니다. 필자의 예제 코드가 (이해할 수있는 한!) 작동하지 않는다는 이유는 타입이 상속 된 후에'_fields_'를 만지기 때문이다. 만약 내가'class'를 사용한다면, 같은 일이 일어날 것입니다. – clacke
구조체> A> B> B에 대해 _fields_를 설정할 때이 문제가 발생했습니다. 그것은 A에서 B로 subbing 할 때 이미 마무리되었지만 Structure에서 A로 subbing하는 동안에는 끝내지 않았습니다. 구조를 서브 클래 싱하는 것은 직접 마무리하지 않는 특별한 경우입니다. – vriesdemichael
구조체는 템플릿 클래스로 동작하므로 하위 클래스가'_fields_'를 쳤을 때 "마법"으로 작동합니다. 그러나 당신의 경우가 잘못되어서 틀린 것이 틀림 없다. 어쩌면 당신은'B'로 서브 클래 싱을 한 후에'A'에'_fields_'를 설정하려고했을 것입니다. – clacke