Импорт всех функций из пакета: "from. * Import *"

Цель

Я хочу иметь возможность импортировать (на __init__.py) все функции из каждого отдельного файла внутри моего пакета.

Применение

Например, в этой структуре папок.

manage.py
- scripts/
   -- __init__.py
   -- tests.py
   -- deploy.py

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

manage.py:

from scripts import *

script/init.py:

from .tests import *
from .deploy import *

Но каждый раз, когда я добавляю еще один файл в пакет, мне нужно добавить строку импорта на script/__init__.py, что довольно раздражает.

Ответ 1

  1. importlib позволяет импортировать любой модуль Python из имени строки. Вы можете автоматизировать его с просмотром списка файлов в пути.

  2. Это больше pythonic для использования __all__. Проверьте здесь для более подробной информации.

Ответ 2

Вы можете сделать это вручную, но не должны.

Почему вы действительно не хотите этого делать:

Вы получите пространство имен, в которых понимание того, что есть и откуда оно взялось, будет чрезвычайно тяжелым, с трудом увеличиваться по мере того, как это делает общий проект. Appart от совершенно неинтуитивного для Python, подумайте о ком-либо другом, который мог бы просмотреть ваш код или, что еще хуже, подумать о том, что вы перечитываете его через 1 месяц и не вспоминаете, что происходит. Вам это не нужно в вашей жизни.

В дополнение к этому, любые функции, которые вы предоставляете импортеру, которые могут пересекаться с другими функциями в других модулях, будут переданы последним импортированным им. В качестве примера рассмотрим два сценария, которые содержат одну и ту же функцию foo() и посмотрите, что происходит.

>>> from scrpt1 import *
>>> foo()
Script 1
>>> from scrpt2 import *
>>> foo()
Script 2

Не нужно и в вашей жизни. Особенно, когда это так легко обойти, будучи явным.


Вот некоторые связанные строки из текста, содержащегося в import this:

Явный лучше, чем неявный.

Внимательно укажите место, где указаны ваши функции. Не "спагетти" вашего кода. Вы захотите поразить себя в будущем, если вы выберете сетку всех вещей в одном месте.

Особые случаи не являются достаточно сложными, чтобы нарушать правила.

Действительно самоочевидно.

Пространства имен - одна хорошая идея - пусть больше таких!

"больше этих!", не меньше; не пропустите, как замечательные пространства имен. Python основан на них; разделение вашего кода в разных пространствах имен является основой организации кода.