Как мне создать указатель на определяемую структуру? - PullRequest
2 голосов
/ 12 марта 2011

Я пишу оболочку Python около getifaddrs(). В интерфейсе используется тип struct ifaddrs, первое поле которого является указателем на другой struct ifaddrs.

struct ifaddrs {
    struct ifaddrs *ifa_next;   /* Pointer to the next structure.  */
    ... /* SNIP!!11 */
};

Однако, представляя это в Python:

class struct_ifaddrs(Structure):

    _fields_ = [
        ('ifa_next', POINTER(struct_ifaddrs)),]

выдает эту ошибку:

matt@stanley:~/src/pydlnadms$ ./getifaddrs.py 
Traceback (most recent call last):
  File "./getifaddrs.py", line 58, in <module>
    class struct_ifaddrs(Structure):
  File "./getifaddrs.py", line 61, in struct_ifaddrs
    ('ifa_next', POINTER(struct_ifaddrs)),
NameError: name 'struct_ifaddrs' is not defined

struct_ifaddrs не будет привязан к текущей области, пока не будет завершено определение класса. Конечно, являясь типом указателя, очевидно, что определение struct_ifaddrs не требуется при объявлении, как в C, но тип должен быть разыменован при последующем использовании. Как я могу продолжить?

1 Ответ

5 голосов
/ 12 марта 2011

Как насчет этого?

class struct_ifaddrs(Structure):
    pass
struct_ifaddrs._fields_ = [
    ('ifa_next', POINTER(struct_ifaddrs)),]

Как отмечает Пол МакГуайр в комментариях, это задокументировано как стандартное решение этой проблемы в документации ctypes и еще раз в тех же документах .

...