Синтаксис cython ctypedef: строка в кавычках в конце? - PullRequest
0 голосов
/ 24 февраля 2020

Я работаю над пониманием petsc4py источников. В них можно найти множество ctypedef объявлений следующей формы:

ctypedef <type> <typename> "<C typename>"

, например:

ctypedef char* PetscMatType "const char*"

или

ctypedef struct PetscMatStencil "MatStencil":
    PetscInt k,j,i,c

(в этом второй случай MatStencil - это тип, который будет известен C во время компиляции из-за его определения в заголовочном файле PETS c.)

Я не смог найти никакого объяснения в Документация Cython, объясняющая это использование строки в кавычках в операторе ctypedef. (Из контекста я понимаю, что cythonize является подсказкой для реализации типа Cython, определяемого с указанным типом C.) Может кто-нибудь сказать мне, где найти этот документально подтвержденный?

В более общем смысле, есть где-нибудь исчерпывающая ссылка на Cython? Основная документация, о которой я знаю, такова: cython.readthedocs.io. Это полезно, но это не исчерпывающая ссылка. Например, если вы ищете его по ctypedef, вы найдете множество примеров, но ни один из синтаксисов, о которых я спрашивал выше. Что вы не нашли, так это исчерпывающее определение синтаксиса ctypedef.

1 Ответ

1 голос
/ 24 февраля 2020

Нет документа, который является более полным справочником, чем документация, на которую вы ссылались. Он действительно содержит то, о чем вы спрашиваете, хотя я подозреваю, что вам нужно знать, что вы ищете, чтобы найти его (к сожалению): https://cython.readthedocs.io/en/latest/src/userguide/external_C_code.html#resolving -naming-конфликты- c -имя- технические характеристики :

Для особых случаев, когда пространства имен или переименования при импорте недостаточно, например, когда имя в C конфликтует с ключевым словом Python, вы можете использовать C спецификация имени для присвоения различных имен Cython и C функции C во время объявления. Предположим, например, что вы хотите обернуть внешнюю функцию C, которая называется yield (). Если вы объявляете это как:

cdef extern from "myheader.h":
    void c_yield "yield" (float speed)```

Затем он продолжает показывать другие примеры структур и переменных, которые переименовываются (но не только typedefs).

По сути, предполагается, что обычно, когда вы оборачиваете что-то в Cython, вы хотите использовать в Cython то же имя, что и в C. Однако иногда это не работает, и этот синтаксис «заключенной в кавычки» позволяет вам указать другое имя, соответствующее вашему C коду.

Это полезный трюк, о котором нужно знать, поскольку он часто позволяет обойти ограничения Cython - например, при переносе одного варианта сильно шаблонизированного класса C ++ без раскрытия всей иерархии шаблонов. В этих случаях я подозреваю, что const в const char приводил в замешательство Cython, и что автор хотел использовать MatStencil в качестве имени в интерфейсе Python (поэтому требовалось другое имя для интерфейса C) , Ложь Cython о мелких деталях часто бывает полезна ...

...