API SciPy#
Импорт из SciPy#
В Python различие между публичным API библиотеки и приватными деталями реализации не всегда ясно. В отличие от других языков, таких как Java, в Python возможно обращаться к "приватным" функциям или объектам. Иногда это может быть удобно, но имейте в виду, что если вы это сделаете, ваш код может сломаться без предупреждения в будущих выпусках. Некоторые широко принятые правила о том, что является публичным, а что нет в Python:
Методы / функции / классы и атрибуты модуля, имена которых начинаются с ведущего подчёркивания, являются приватными.
Если имя класса начинается с подчёркивания, ни один из его членов не является публичным, независимо от того, начинаются ли они с подчёркивания.
Если имя модуля в пакете начинается с подчёркивания, ни один из его членов не является публичным, независимо от того, начинаются ли они с подчёркивания.
Если модуль или пакет определяет
__all__, который авторитетно определяет публичный интерфейс.Если модуль или пакет не определяет
__all__, тогда все имена, которые не начинаются с подчёркивания, являются публичными.
Примечание
Читая приведенные выше рекомендации, можно сделать вывод, что каждый частный модуль или объект начинается с подчеркивания. Это не так; наличие подчеркиваний действительно отмечает что-то как частное, но отсутствие подчеркиваний не отмечает что-то как публичное.
В SciPy есть модули, имена которых не начинаются с подчеркивания, но которые следует считать приватными. Чтобы уточнить, какие это модули, мы определяем ниже, что является публичным API для SciPy, и даем некоторые рекомендации по импорту модулей/функций/объектов из SciPy.
Рекомендации по импорту функций из SciPy#
Всё в пространствах имён подмодулей SciPy является публичным. В целом в Python рекомендуется использовать пространства имён. Например, функция curve_fit (определено в scipy/optimize/_minpack_py.py) следует
импортировать так:
import scipy
result = scipy.optimize.curve_fit(...)
Или, как вариант, можно использовать подмодуль как пространство имён следующим образом:
from scipy import optimize
result = optimize.curve_fit(...)
Примечание
Для scipy.io предпочитают использование import scipy
потому что io также является именем модуля в стандартной библиотеке Python.
В некоторых случаях публичный API находится на один уровень глубже. Например,
scipy.sparse.linalg модуль является публичным, и содержащиеся в нем функции не
доступны в scipy.sparse пространство имён. Иногда код может быть более понятным, если функции импортируются на один уровень глубже.
Например, в следующем примере сразу понятно, что lomax является
распределением, если выбран второй вид:
# first form
from scipy import stats
stats.lomax(...)
# second form
from scipy.stats import distributions
distributions.lomax(...)
В этом случае можно выбрать вторую форму if в следующем разделе документировано, что рассматриваемый подмодуль является публичным. Конечно, вы всё ещё можете использовать:
import scipy
scipy.stats.lomax(...)
# or
scipy.stats.distributions.lomax(...)
Примечание
SciPy использует механизм ленивой загрузки, что означает, что модули загружаются в память только при первой попытке доступа к ним.
Определение API#
Все перечисленные ниже подмодули являются публичными. Это означает, что эти подмодули вряд ли будут переименованы или изменены несовместимым образом, и если это необходимо, предупреждение об устаревании будет выдано в течение одного выпуска SciPy перед внесением изменений.
-
scipy.stats.distributions
Структура SciPy#
Все модули SciPy должны следовать следующим соглашениям. В следующем, a Модуль SciPy определяется как пакет Python, например,
yyy, который находится в директории scipy/.
В идеале каждый модуль SciPy должен быть максимально самодостаточным. То есть он должен иметь минимальные зависимости от других пакетов или модулей. Даже зависимости от других модулей SciPy должны быть сведены к минимуму. Зависимость от NumPy, конечно, предполагается.
Директория
yyy/содержит:Файл
meson.buildс конфигурацией сборки для подмодуля.Каталог
tests/который содержит файлыtest_соответствующие модулям.py yyy/.{.py,.so,/}
Приватные модули должны иметь префикс с подчеркиванием
_, напримерyyy/_somemodule.py.Функции, видимые пользователю, должны иметь хорошую документацию, следующую Стиль документации NumPy.
The
__init__.pyмодуля должен содержать основную справочную документацию в своей строке документации. Это связано с документацией Sphinx подdoc/через директиву automodule Sphinx.Справочная документация должна сначала давать категоризированный список содержимого модуля, используя
autosummary::директивы, и после этого объяснить моменты, важные для понимания использования модуля.Учебная документация с обширными примерами должна быть отдельной и размещена под
doc/source/tutorial/.
Смотрите существующие подмодули SciPy для руководства.