Я разрабатываю пакет Python для работы с некоторыми научными данными. Существует множество часто используемых классов и функций из других модулей и пакетов, включая numpy, которые мне нужны практически для каждой функции, определенной в любом модуле пакета.
Каким будет питоновский способ справиться с ними? Я рассмотрел несколько вариантов, но у каждого есть свои недостатки.
-
Импортируйте классы на уровне модуля с помощью
from foreignmodule import Class1, Class2, function1, function2
Затем импортируемые функции и классы легко доступны из каждой функции. С другой стороны, они загрязняют пространство имен модулей, делаяdir(package.module)
иhelp(package.module)
загроможденными импортированными функциями -
Импортируйте классы на уровне функции с помощью
from foreignmodule import Class1, Class2, function1, function2
Функции и классы легко доступны и не загрязняют модуль, но импорт из до десяти модулей в каждой функции выглядит как много дублирующегося кода. -
Импортируйте модули на уровне модуля с помощью
import foreignmodule
Не слишком большое загрязнение компенсируется необходимостью добавлять имя модуля к каждой функции или вызову класса. -
Используйте искусственный обходной путь, например, используя тело функции для всех этих манипуляций и возвращающее только объекты, которые нужно экспортировать... например
def _export(): from foreignmodule import Class1, Class2, function1, function2 def myfunc(x): return function1(x, function2(x)) return myfunc myfunc = _export() del _export
Это позволяет решить обе проблемы, загрязнение пространства имен модулей и простоту использования функций... но, похоже, это вообще не Pythonic.
Итак, какое решение является самым Pythonic? Есть ли еще одно хорошее решение, которое я пропустил?