Именование и импорт пакетов Python

У меня есть пакет под названием foo. Он организован следующим образом:

package_dir/foo/foo.py
package_dir/foo/utils.py
package_dir/foo/other.py
package_dir/foo/__init__.py

Возможно, мне следовало назвать foo.py как-нибудь иначе, но эта библиотека со временем росла и развивалась, теперь поддерживает другие вещи и используется повсюду. Пакет собран и хранится на нашем внутреннем pipy-сервере, поэтому при установке я получаю /usr/lib/python2.7/site-packages/foo.

Как лучше всего импортировать из этого пакета?

В настоящее время я делаю это:

import foo

Затем я делаю это в клиентском коде:

foo.foo.myfunction()

Для использования этого подхода можно использовать множество классов и функций:

from foo import blah, blah, blah

Это становится немного глупо. Это питонический подход к пакетам? Есть лучший способ это сделать?

Спасибо за любую помощь.

* Обновить *

Итак, я сделал это, но не нашел свои функции:

from __init__.py:

import foo
import utils
import other

Затем я импортирую вот так:

import foo

Затем в моем коде я пробовал:

foo.myfunc()

А также:

myfunc()

Оба жалуются:

AttributeError: 'module' object has no attribute 'myfunc'
import foo as something_else?
heemayl 19.03.2018 19:38
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
67
1

Ответы 1

У вас есть несколько вариантов:

from foo import foo
foo.myfunction()

Или же

from foo import foo as something
something.myfunction()

Или же

import foo.foo as something
something.myfunction()

Или вы можете «продвигать» некоторые API, чтобы они публиковались с верхнего уровня. Импортируйте их в foo/__init__.py, а затем вы можете использовать их из объекта пакета. Например, ваш новый foo/__init__.py может быть:

from .foo import myfunction

Обратите внимание на явный синтаксис относительного импорта, чтобы избежать двусмысленности между пакетом верхнего уровня foo и вложенным пакетом foo.

Тогда вы можете написать:

import foo
foo.myfunction()

и так далее.

Милый, я поиграю с их продвижением в в этом.py, это кажется лучшим вариантом для моих вещей.

BenH 19.03.2018 19:46

@BenH В stdlib есть примеры этого, на которые стоит обратить внимание. (Не то чтобы это было трудно понять как, но это примеры того, когда это делать и какие имена нужно «продвигать».) Я не помню, какие модули были у меня в голове, но вы можете добраться до источник для stdlib, перейдя к документации по большинству модулей, щелкнув ссылку «источник» вверху и исследуя ее оттуда.

abarnert 19.03.2018 19:51

Я не могу заставить этот подход работать, см. Мое обновление выше. Спасибо

BenH 19.03.2018 20:06

добавлен пример __init__.py

Jean-Paul Calderone 19.03.2018 20:37

Другие вопросы по теме