tCommon импортирует Cython - PullRequest
       11

tCommon импортирует Cython

0 голосов
/ 27 февраля 2020

У меня есть файловая структура

[CODE DIR]
- foo_1.pyx
- foo_1.pxd
- ...
- foo_n.pyx

с большинством файлов, разделяющих некоторые операторы импорта, т.е. from cython cimport [somePackage].

Проблема

Я хочу иметь один общий файл foo_common.pyx, который содержит общий импорт файлов foo_x.pyx без копирования большинства из них. foo_common.pyx будет содержать, например,

[foo_common.pyx]
cimport numpy as np
from cython.parallel cimport prange 
....

Я попытался поместить некоторые общие определения в файл pyx или pxd, но, похоже, что Cython видит только класс или другие определения, но нет. Возможно ли в Cython иметь общий «подобный заголовку» файл, в котором читаются операторы импорта?

Уточнение

У меня есть файл определений definitions.pxd:

[definitions.pxd]
cimport cython

У меня есть другой файл foo_1.pyx

[foo_1.pyx]
from definitions cimport *

@cython.cdivision(True)
cdef doing_something (int x):
     return x

будет ошибка, заявив, что cdef function cannot take arbitrary decorators. Изменение cimport на include будет работать без ошибок. Почему это поведение отличается?

Оглядываясь назад, я нашел свой ответ относительно того, что может быть в pxd для совместного использования определений:

It cannot contain the implementations of any C or Python functions, or any Python class definitions, or any executable statements. от здесь . Кажется, что include - это путь к go, поскольку операторы cimport / import игнорируют любое другое определение; только соответствующие определения C / C ++.

1 Ответ

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

Cython имеет два способа обмена информацией между несколькими pyx -файлами:

  • с использованием cimport -механизма является python -подобным, более сложным способом, похожим на import.
  • с использованием include соответствует простому C -i sh способу простого сброса содержимого заголовка в другие файлы, например #include <xxx>.

Что Вы ищете это второй вариант. Например, после определения common.pxi как:

# common.pxi
from libc.stdint cimport  int64_t   
ctypedef double float64
...

его можно использовать в разных pyx-файлах, a.pyx:

# a.pyx:
include "common.pxi"  # definitions of float64_t, int64_t are now known

# float64_t, int64_t are used:
cdef doit_a(float64_t a, int64_t b):
    ....

и b.pyx:

# b.pyx:
include "common.pxi"  # definitions of float64_t, int64_t are now known

# float64_t, int64_t are used:
cdef doit_a(float64_t a, int64_t b):
    ....

При использовании pxi -файлов для общих typedef и cimports, но также для разделения pyx-файла на несколько частей, допустимо использование - для других сценариев ios pxd -файлов являются лучшим вариантом, а иногда и единственным (нормальным) вариантом (совместно используемый cdef -интерфейс cdef class).

Одним из преимуществ pxd -файлов является больший контроль над тем, что импортируется, аналогично import можно импортировать все через

# definitions are in common.pxd
from common cimport *

, но есть также возможность импортировать только некоторые имена.

...