Работа с модулями: создание, подключение инструкциями import и from
Модулем в Python называется любой файл с программой (да-да, все те программы, которые вы писали, можно назвать модулями). В этой статье мы поговорим о том, как создать модуль, и как подключить модуль, из стандартной библиотеки или написанный вами.
Каждая программа может импортировать модуль и получить доступ к его классам, функциям и объектам. Нужно заметить, что модуль может быть написан не только на Python, а например, на C или C++.
Подключение модуля из стандартной библиотеки
Подключить модуль можно с помощью инструкции import. К примеру, подключим модуль os для получения текущей директории:
После ключевого слова import указывается название модуля. Одной инструкцией можно подключить несколько модулей, хотя этого не рекомендуется делать, так как это снижает читаемость кода. Импортируем модули time и random.
После импортирования модуля его название становится переменной, через которую можно получить доступ к атрибутам модуля. Например, можно обратиться к константе e, расположенной в модуле math:
Стоит отметить, что если указанный атрибут модуля не будет найден, возбудится исключение AttributeError. А если не удастся найти модуль для импортирования, то ImportError.
Использование псевдонимов
Если название модуля слишком длинное, или оно вам не нравится по каким-то другим причинам, то для него можно создать псевдоним, с помощью ключевого слова as.
Теперь доступ ко всем атрибутам модуля math осуществляется только с помощью переменной m, а переменной math в этой программе уже не будет (если, конечно, вы после этого не напишете import math, тогда модуль будет доступен как под именем m, так и под именем math).
Инструкция from
Подключить определенные атрибуты модуля можно с помощью инструкции from. Она имеет несколько форматов:
Первый формат позволяет подключить из модуля только указанные вами атрибуты. Для длинных имен также можно назначить псевдоним, указав его после ключевого слова as.
Импортируемые атрибуты можно разместить на нескольких строках, если их много, для лучшей читаемости кода:
Второй формат инструкции from позволяет подключить все (точнее, почти все) переменные из модуля. Для примера импортируем все атрибуты из модуля sys:
Следует заметить, что не все атрибуты будут импортированы. Если в модуле определена переменная __all__ (список атрибутов, которые могут быть подключены), то будут подключены только атрибуты из этого списка. Если переменная __all__ не определена, то будут подключены все атрибуты, не начинающиеся с нижнего подчёркивания. Кроме того, необходимо учитывать, что импортирование всех атрибутов из модуля может нарушить пространство имен главной программы, так как переменные, имеющие одинаковые имена, будут перезаписаны.
Создание своего модуля на Python
Теперь пришло время создать свой модуль. Создадим файл mymodule.py, в которой определим какие-нибудь функции:
Теперь в этой же папке создадим другой файл, например, main.py:
Поздравляю! Вы сделали свой модуль! Напоследок отвечу ещё на пару вопросов, связанных с созданием модулей:
Как назвать модуль?
Помните, что вы (или другие люди) будут его импортировать и использовать в качестве переменной. Модуль нельзя именовать также, как и ключевое слово (их список можно посмотреть тут). Также имена модулей нельзя начинать с цифры. И не стоит называть модуль также, как какую-либо из встроенных функций. То есть, конечно, можно, но это создаст большие неудобства при его последующем использовании.
Модули Python – примеры создания, импорта и использования
Модулем python может быть любой программный файл python, который содержит код, включая функции, класс или переменные python. Другими словами, мы можем сказать, что файл кода Python, сохраненный с расширением(.py), рассматривается как модуль. У нас может быть исполняемый код внутри модуля python.
Модули в Python отличаются маневренностью в логической организации кода. Чтобы использовать функциональность одного модуля в другом, мы должны импортировать конкретный модуль.
Создадим модуль с именем file.py, который содержит функцию func, которая содержит код для вывода некоторого сообщения на консоль.
Необходимо включить этот модуль в наш основной модуль, чтобы вызвать метод displayMsg(), определенный в модуле с именем file.
Загрузка модуля в код Python
Нам нужно загрузить модуль в код Python, чтобы использовать его функции. Python предоставляет два типа операторов:
Оператор импорта
Оператор импорта используется для импорта всех функций одного модуля в другой. Здесь мы должны заметить, что мы можем использовать функциональность любого исходного файла Python, импортировав этот файл в качестве модуля в другой исходный файл Python.
Мы можем импортировать несколько модулей с помощью одного оператора импорта, но модуль загружается один раз, независимо от того, сколько раз он был импортирован в наш файл.
Синтаксис для использования оператора импорта приведен ниже.
Следовательно, если нам нужно вызвать функцию displayMsg(), определенную в файле file.py, мы должны импортировать этот файл как модуль в наш модуль, как показано в примере ниже.
Оператор from-import
Вместо того, чтобы импортировать весь модуль, в python имеется возможность импортировать только определенные атрибутов модуля. Это можно сделать с помощью from-import оператора. Синтаксис для использования оператора from-import приведен ниже.
Рассмотрим следующий модуль, называемый calculation, который содержит три функции: суммирование, умножение и деление.
Оператор from … import всегда лучше использовать, если мы заранее знаем атрибуты, которые нужно импортировать из модуля. Это не позволяет нашему коду быть тяжелее. Мы также можем импортировать все атрибуты из модуля, используя *.
Рассмотрим следующий синтаксис.
Переименование модуля
Python предоставляет нам возможность импорта некоторого модуля с определенным именем, чтобы мы могли использовать его имя для этого модуля в нашем исходном файле python.
Синтаксис для переименования модуля приведен ниже.
Использование функции dir()
Функция dir() возвращает отсортированный список имен, определенных в переданном модуле. Этот список содержит все подмодули, переменные и функции, определенные в этом модуле.
Рассмотрим следующий пример.
Функция reload()
Как мы уже говорили, модуль загружается один раз независимо от того, сколько раз он был импортирован в исходный файл python. Однако, если вы хотите перезагрузить уже импортированный модуль, чтобы повторно выполнить код верхнего уровня, python предоставляет нам функцию reload(). Синтаксис использования функции reload() приведен ниже.
Например, чтобы перезагрузить вычисление модуля, определенное в предыдущем примере, мы должны использовать следующую строку кода.
Объем переменных
В Python переменные связаны с двумя типами областей видимости. Все переменные, определенные в модуле, содержат глобальную область видимости до тех пор, пока она не определена в функции.
Все переменные, определенные внутри функции, содержат локальную область видимости, которая ограничена самой этой функцией. Мы не можем получить глобальный доступ к локальной переменной.
Если две переменные определены с одним и тем же именем с двумя разными областями действия, т. е. локальной и глобальной, то приоритет всегда будет отдаваться локальной переменной.
Рассмотрим следующий пример.
Пакеты Python
Пакеты в python облегчают разработчикам среду разработки приложений, предоставляя иерархическую структуру каталогов, в которой пакет содержит подпакеты, модули и подмодули. Пакеты используются для эффективной категоризации кода уровня приложения.
Создадим пакет с именем «Сотрудники» в вашем домашнем каталоге пошагово.
1. Создайте каталог с именем Сотрудники / home.
2. Создайте исходный файл python с именем ITEmployees.py / home / Employees.
3. Аналогичным образом создайте еще один файл python с именем BPOEmployees.py и функцию getBPONames().
4. Теперь каталог «Сотрудники», который мы создали на первом шаге, содержит два модуля Python. Чтобы сделать этот каталог пакетом, нам нужно включить сюда еще один файл, то есть __init__.py, который содержит операторы импорта модулей, определенных в этом каталоге.
5. Теперь каталог «Сотрудники» стал пакетом, содержащим два модуля Python. Здесь мы должны заметить, что мы должны создать __init__.py внутри каталога, чтобы преобразовать этот каталог в пакет.
6. Чтобы использовать модули, определенные внутри пакета Employees, мы должны импортировать их в наш исходный файл python. Давайте создадим простой исходный файл Python в нашем домашнем каталоге(/ home), который использует модули, определенные в этом пакете.
Внутри пакетов могут быть подпакеты. Мы можем вкладывать пакеты до любого уровня в зависимости от требований приложения.
На следующем изображении показана структура каталогов системы управления библиотекой приложений, которая содержит три подпакета: Admin, Librarian и Student. Подпакеты содержат модули Python.
Импорт и создание модулей
Содержание
Импорт модулей стандартной библиотеки
Использование псевдонимов
Если название модуля слишком длинное и вы не хотите его писать каждый раз, когда используете какую-то функцию, вы можете импортировать этот модуль под псевдонимом с помощью as:
Импорт нескольких модулей
Модули можно импортировать в одну строчку через запятую, если требуется использовать несколько, либо можно писать каждый импорт на новой строчке.
Инструкция from
Иногда в модуле бывает много разных функций, а вам нужно использовать только что-то одно (и, например, использовать много раз), тогда проще импортировать какую-то определенную функцию из этого модуля и (1) чуть-чуть сэкономить память, (2) короче синтаксис. Тогда синтаксис импорта будет следующий:
Также можно импортировать из модуля всё. То есть все функции, переменные и классы. Тогда нам не нужно каждый раз писать название модуля.
Правило хорошего тона — импортировать модули вначале вашей программы, до любого другого кода и функций.
Создание своего модуля питон
Давайте напишем скрипт с парой функций и импортируем эти функции в другую программу.
Создадим программу mymodule.py:
В ней мы прописали две математические функции: среднее и факториал. Предположим теперь мы хотим воспользоваться ими в какой-нибудь другой программе myscript.py. Тогда мы положим эти два файла в одну директорию, чтобы импорт работал. И в результате мы сможем ипмортировать эти функции в новую программу.
Файл myscript.py:
Кстати, найдите баг в этом коде:
Задача: составление анаграмм
В качестве примера использования функций и модуля стандартной библиотеки random рассмотрим задачу составления анаграмм. В качестве входного файла будем использовать любой текст, из которого мы выберем слова. Пусть текст находится в файле text.txt и имеет следующее содержание (из Яндекс.Рефератов):
Полный код для решения этой задачи может выглядеть следующим образом:
Домашнее задание
Пусть какая-то функция получает на вход список из 30 случайных целых чисел от 0 до 100, сгенерированных с помощью модуля random. В вариантах описана функция.
+1 балл для всех: ответьте коротко на вопрос “Почему модуль random на самом деле НЕ генерирует случайные числа?”
Функция берёт два случайных числа из этого списка (с помощью модуля random) и считает по ним количество всевозможных сочетаний этих чисел с точки зрения теории вероятности, С из n по k (использовать функцию из модуля math – factorial). Количество сочетаний (в формате float) печатается. k должно быть меньше n
Функция возвращает произведение значений списка. Нужно пользоваться модулем math. Руководствоваться надо тем, что exp(log(a) + log(b)) = a * b
Функция возвращает строку из 30 букв. Список, полученный на вход, задает порядок букв в строке по номеру буквы в алфавите.
Функция берёт из списка 4 случайных числа, условно принимает их за две точки в двумерном пространстве и возвращает евклидово расстояние между этими точками. Использовать модули random и math.
Функция перемешивает список с помощью random.shuffle(), сравнивает его с исходным списком и возвращает количество индексов, значение элемента по которым поменялось. Запустите функцию в цикле 100 раз и напечатайте в скольки процентов случаев меняются все элементы списка.
Функция возвращает среднее геометрическое списка. Вомпользуйтесь модулем math. Отдельно вне функции покажите, что ее результат лежит между минимальным и максимальным значениями списка для 20 случаев. (Для это нужно на каждой итерации генерировать подаваемый на вход список заново)
Функция возвращает среднее арифметическое элементов списка, округлённое вверх. Используйте модуль math.
Изучаем Python. №18. Пишем свой модуль на python3
Сегодня мы научимся азам написания своих модулей на python. Но, сначала разберемся как вообще работает система подключения модулей.
Когда вы подключаете модуль в вашу программу, то интерпретатор ищет его в первую очередь сначала в текущем каталоге, если модуля с указанным именем там нет, то он обращается к каталогам указанным в переменной окружения PYTHONPATH,в зависящих от платформы путях по умолчанию и, на конец, в специальных файлах с расширением ‘.pth’, которые лежат в стандартных каталогах.
Вы можете внести свой путь в PYTHONPATH и ‘.pth’. Все каталоги, в которых происходит поиск можно посмотреть в переменной sys.path.
Наш модуль будет состоять из двух файлов __init__.py и modul.py. Файл __init__.py является конфигурационным и не должен содержать какие-либо функции и переменные. Всу логику вашего модуля необходимо описывать непосредственно в module.py (на самом деле вы можете назвать его как угодно, даже piupiu.py). По правде и __init__.py можно не создавать, если ваш модуль состоит всего лишь из одного файла. __init__.py нужен для формирования пакета — набора модулей одной программы. В нем вы сможете разместить описание вашего модуля.
Я на примере покажу что такое модуль и пакет. Для начала создадим модуль shutnik.py в той же папке где и ваш основной файл main.py.
Код модуля:
Теперь подключаем его к нашему основному файлу:
И теперь, если вы выполните его, то увидите, что он выводит случайную шутку.
ничего сложного. Теперь создадим пакет. Это тоже просто. Для начала создаем папку ‘fmd’ (сокращенно от firstmodule) и уже внутри нее __init__.py, modul.py hello.py
Код __init__.py:
Теперь, чтобы пакет заработал, его папку нужно копировать в каталог модулей. У меня он находиться тут C:\Python\Python35-32\Lib\site-packages\
Если вы все сделали как нужно, тогда изменим наш main.py и посмотрим результат.
Код main.py:
На этом все, оставляйте свои вопросы и замечания в комментариях.
2 идей о “ Изучаем Python. №18. Пишем свой модуль на python3 ”
всегда мучал только один вопрос — почему уроки по python публикуются на сайте wordpress?….
Две причины, wp легко и дешиво деплоить. Если на python появится удобная cms и параллельно ее будет удобно хостить, то wp однозначно потеряет часть рынка)
Добавить комментарий Отменить ответ
Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.
Модули Python: Создание, импорт и совместное использование
Вступление
Создание модуля
Основы
На самом деле в создании модуля Python нет особой философии, поскольку файлы с суффиксом .py представляют собой модуль. Хотя не каждый файл Python предназначен для импорта в виде модуля. Файлы Python, которые используются для запуска в качестве автономного приложения Python (файлы верхнего уровня), обычно предназначены для запуска в виде скриптов, и их импорт фактически запускает команды в скрипте.
Модули, предназначенные для импорта другим кодом, не будут выполнять какой-либо код, а только предоставлять его имена верхнего уровня в качестве атрибутов импортируемому объекту. Также можно разработать двухрежимный код модули Python, которые можно было бы использовать как для импорта, так и для запуска в качестве скрипта верхнего уровня.
В то время как правила создания модулей довольно расслаблены, существует одно правило именования модулей. Поскольку имена файлов модулей становятся именами переменных в Python при импорте, не разрешается называть модули зарезервированными словами Python. Например, a for.py модуль может быть создан, но не может быть импортирован, потому что “for” – это зарезервированное слово. Давайте проиллюстрируем то, что мы уже упоминали, на примере “Привет, мир!”.
‘my_module.py’ разработан как модуль, код которого может быть импортирован и повторно использован в других файлах Python. Это видно по его содержанию: он не требует никаких действий, просто определяет функции и переменные. В отличие от этого, ‘my_script.py’ разработан как скрипт верхнего уровня, который запускает программу Python-он явно вызывает функцию hello_printer и выводит значение переменной на экран.
Давайте запустим ‘my_script.py-файл в терминале:
Как отмечалось ранее, важным выводом из этого первого базового примера является то, что имена файлов модулей важны. После импорта они становятся переменными/объектами в модуле импортера. Все определения кода верхнего уровня в модуле становятся атрибутами этой переменной.
В следующем разделе мы сначала рассмотрим “общую картину” многофайловых программ Python, а затем в “двойном режиме” файлы Python.
Архитектура программы
Любая нетривиальная программа на Python будет организована в несколько файлов, связанных друг с другом с помощью импорта. Python, как и большинство других языков программирования, использует эту модульную структуру программы, где функциональные возможности группируются в многоразовые единицы. В общем, мы можем выделить три типа файлов в многофайловом приложении Python:
На рис. 1 показан пример структуры программы с тремя типами файлов:
Рис. 1: Пример структуры программы, включающей сценарий верхнего уровня, пользовательские модули и стандартные библиотечные модули.
Давайте проиллюстрируем это на примере кода:
В приведенном выше примере ‘top_module.py’-это модуль верхнего уровня, который будет запускаться пользователем, и он импортирует инструменты из других модулей через ‘module1.py”. module1 и module2 являются пользовательскими модулями, в то время как модуль ‘math’ импортируется из стандартной библиотеки Python. При запуске скрипта верхнего уровня мы получаем:
Двухрежимный код
Как упоминалось ранее, файлы Python также могут быть разработаны как импортируемые модули, так и скрипты верхнего уровня. То есть при запуске модуль Python будет работать как автономная программа, а при импорте-как импортируемый модуль, содержащий определения кода.
Вот пример двухрежимного кода:
Двухрежимный код очень распространен на практике и особенно полезен для модульного тестирования: в то время как переменные и функции определяются как имена верхнего уровня в файле, часть внутри оператора if может служить областью тестирования указанных выше имен.
Использование модуля
Инструкции по импорту
Это позволит импортировать все имена (переменные и функции) из module2.py файл. Такой подход не рекомендуется из – за возможного дублирования имен-импортированные имена могут перезаписать уже существующие имена в модуле импортера.
Путь Поиска модуля
Одним из важных аспектов при написании модульных приложений Python является поиск модулей, которые необходимо импортировать. В то время как модули стандартной библиотеки Python настроены на глобальный доступ, импорт пользовательских модулей через границы каталогов может стать более сложным.
Python использует список каталогов, в которых он ищет модули, известный как путь поиска . Путь поиска состоит из каталогов, найденных в следующих каталогах:
/.bash_profile файлам, где ваши каталоги объединены знаком двоеточия (“:”).
В любом случае параметры PYTHONPATH и .path позволяют более постоянно изменять путь поиска. Важно знать, что Python сканирует строку пути поиска слева направо, поэтому модули в самых левых перечисленных каталогах могут перезаписывать те, которые имеют то же имя в самой правой части. Обратите внимание, что пути поиска модулей необходимы только для импорта модулей из разных каталогов.
Как показано в следующем примере, пустая строка в начале списка предназначена для текущего каталога:
В конечном счете, организация вашей программы на Python в нескольких взаимосвязанных модулях довольно проста, если ваша программа хорошо структурирована: в автономных, естественно сгруппированных частях кода. В более сложных или не очень хорошо структурированных программах импорт может стать бременем, и вам придется заняться более сложными темами импорта.
Перезагрузка модуля
Вот вам пример. Давайте повторно использовать приведенный выше код в ‘my_module.py’, импортируйте его в интерпретатор Python, затем измените файл и повторно импортируйте его снова.
Функция reload изменяет модуль на месте. То есть, не затрагивая другие объекты, которые ссылаются на импортированный модуль. Вы можете заметить, что функция также возвращает сам модуль, давая его имя и путь к файлу. Эта функция особенно полезна на этапе разработки, но также и в более крупных проектах.
Например, для программ, которым требуется постоянное подключение к серверу, перезапуск всего приложения обходится гораздо дороже, чем динамическая перезагрузка или горячая перезагрузка для использования во время разработки.
Пакеты модулей
При импорте имен модулей вы фактически загружаете файлы Python, хранящиеся где-то в вашей файловой системе. Как упоминалось ранее, импортированные модули должны находиться в каталоге, который указан в пути поиска вашего модуля ( sys.path ). В Python есть нечто большее, чем просто “импорт имен” – вы действительно можете импортировать целый каталог, содержащий файлы Python, как пакет модуля . Этот импорт известен как package imports .
Итак, как вы импортируете пакеты модулей? Давайте создадим каталог с именем ‘mydir’, который включает в себя ‘mod0.py’ модуль и два подкаталога ‘subdir1’ и ‘subdir2’, содержащие ‘mod1.py-и …mod2.py – модули соответственно. Структура каталогов выглядит следующим образом:
Обычный подход, объясненный до сих пор, состоял в том, чтобы добавить пути ‘mydir’, ‘subdir1’ и ‘subdir2’ к пути поиска модуля ( sys.path ), чтобы иметь возможность импортировать ‘mod0.py’, ‘mod1.py-и …mod2.py”. Это может стать большим накладным расходом, если ваши модули распределены по многим различным подкаталогам, что обычно и происходит. В любом случае, импорт пакетов здесь, чтобы помочь. Они работают с импортом имени самой папки.
Эта команда, например, не разрешена и приведет к Неверный синтаксис ошибка:
Правильный способ сделать это-установить только каталог контейнера “/Users/Code/Projects/” в пути поиска модуля (добавив его в переменную среды PYTHONPATH или перечислив в файле .pth ), а затем импортировать модули с помощью точечного синтаксиса. Это некоторые допустимые импортные операции:
Вы, вероятно, уже замечали ранее, что некоторые каталоги Python включают в себя __init__.py файл. На самом деле это было требование в Python2.x, чтобы сообщить Python, что ваш каталог является пакетом модулей. __init__.py file также является обычным файлом Python, который запускается всякий раз, когда этот каталог импортируется, и подходит для инициализации значений, например для подключения к базе данных.
Во всяком случае, в большинстве случаев эти файлы просто остаются пустыми. В Python3.x эти файлы необязательны, и вы можете использовать их при необходимости. Следующие несколько строк показывают, как имена определяются в __init__.py становятся атрибутами импортируемого объекта (имя каталога, содержащего его).
Мы продемонстрируем один полезный случай на примере:
Относительный импорт-это огромная тема, которая может занять целую главу книги. Они также сильно отличаются между версиями Python2.x и 3.x. На данный момент мы показали только один полезный случай, но должно быть еще больше, чтобы следить за ним в отдельных сообщениях в блоге.
Отправка пакета в PyPI
До сих пор вы научились писать модули Python, различать импортируемые модули и модули верхнего уровня, использовать пользовательские модули через границы каталогов, изменять путь поиска модулей и создавать/импортировать пакеты модулей, среди прочего. После того, как вы создали полезное программное обеспечение, упакованное в пакет модулей, вы можете поделиться им с большим сообществом Python. В конце концов, Python построен и поддерживается сообществом.
Например следующая строка загрузит и установит библиотеку Numpy для научных вычислений:
В этом-то все и дело. Для получения дополнительной информации на веб-сайте PyPI есть все подробные инструкции, если вы застряли.
Вывод
Этот пост был предназначен для того, чтобы провести вас от основных основ модулей Python (создание и импорт ваших первых импортируемых модулей) к немного более продвинутым темам (изменение пути поиска, пакеты модулей, перезагрузки и некоторые основные относительные импорта), чтобы отправить ваш пакет Python в репозиторий программного обеспечения Python PyPI.
Существует много информации на эту тему, и мы не смогли охватить все в этом посте, так что вы, возможно, не сможете выполнить все эти шаги и представить официальный пакет в течение времени чтения этого поста. Тем не менее, каждый шаг должен быть кратким введением, чтобы направлять вас на вашем пути обучения.