Как сделать ваши модули Python более удобными для пользователя

Мотивация

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

Таким образом, вы хотите упростить пользователям использование вашего модуля. Код для импорта и запуска вашего модуля должен быть коротким. В этой статье я покажу вам 3 способа упростить импорт и выполнение ваших модулей Python.

Импортировать все

Сценарий

Представьте, что у нас есть файл с именем utils.py, содержащий все важные функции и классы.

В другом сценарии мы хотим импортировать все из utils.py кроме переменнойa, используя from utils import *. Как мы можем сделать это?

Решение

Это легко сделать, добавив__all__ = [“add_two”, “multiply_by_two”]. Функции, классы и пакеты, указанные в __all__, будут импортированы при использовании import *.

Теперь попробуйте использовать import * в другом скрипте

5
6
Traceback (most recent call last):
  File "main.py", line 6, in <module>
    print(a)
NameError: name 'a' is not defined

Прохладный! Ошибка показывает нам, что импортируются только add_two и multiply_by_two из utils.py, а a не импортируется.

Объединить несколько файлов

Сценарий

Представьте, как выглядит структура файлов в нашем каталоге ниже:

.
├── data_modules
│   ├── load_data.py
│   └── process_data.py
└── main.py

load_data.py выглядит так:

и process_data.py выглядит так:

Чтобы использовать классы из двух разных файлов, нам нужно импортировать каждый класс из каждого файла.

Этот метод хорош, но использование двух операторов импорта излишне. Есть ли способ превратить два оператора импорта в один оператор импорта, как показано ниже?

Решение

Эту проблему легко решить с помощью файла __init__.py. Вставьте файл __init__.py в каталогdata_modules:

touch data_modules/__init__.py

Затем вставьте операторы импорта, упомянутые ранее, в файл__init__.py:

Мы используем здесь ., потому что load_data.py находится в том же каталоге, что и __init__.py.

Теперь попробуем импортировать DataLoader и DataProcessor из data_modules

Loading data from data/
Processing data1

Отлично! Оно работает!

Запустите каталог как основной скрипт

Сценарий

Наш каталог выглядит так:

.
└── data_modules
    ├── __init__.py
    ├── load_data.py
    ├── main.py
    └── process_data.py

Вместо того, чтобы бежать

$ python data_modules/main.py

мы могли бы упростить для наших пользователей или товарищей по команде запуск файла кода main.py, просто запустив родительский каталог:

$ python data_modules

Это лучше, чем бегpython data_modules/main.py, потому что он короче, и пользователям не нужно знать, какие файлы находятся в data_modules.

Как мы можем сделать это?

Решение

Вот тут-то и пригодится __main__.py. Просто измените сценарий, который вы хотите запустить при запуске каталога верхнего уровня, на __main__.py. В нашем примере main.py станет __main__.py.

# Rename main.py to __main__.py
$ mv data_modules/main.py data_modules/__main__.py

Наш новый каталог будет выглядеть так

.
└── data_modules
    ├── __init__.py
    ├── load_data.py
    ├── __main__.py
    └── process_data.py

Теперь беги

$ python data_modules
Loading data from data/
Processing data1

И это работает как шарм!

Заключение

Поздравляю! Вы только что узнали, как облегчить вам и тем, кто пользуется вашим пакетом:

  • Контроль того, что импортировать при использовании import *
  • Сокращение ваших операторов импорта
  • Запуск каталога верхнего уровня в качестве основного скрипта

Я надеюсь, что эти уловки сделают ваш пакет Python более удобным для пользователя. Ваши товарищи по команде и пользователи будут рады использовать ваш пакет, если им будет легко получить доступ к вашим полезным модулям.

Исходный код этой статьи можно найти здесь:



Мне нравится писать об основных концепциях науки о данных и играть с различными алгоритмами и инструментами анализа данных. Вы могли связаться со мной в LinkedIn и Twitter.

Пометьте это репо, если хотите проверить коды всех моих статей. Следуйте за мной на Medium, чтобы быть в курсе моих последних статей по науке о данных, таких как:









Ссылка

Бизли, Д. М., и Джонс, Б. К. (2014). Поваренная книга Python. Пекин; Кембридж; Фарнем; Кёльн; Севастополь; Токио: О'Рейли.