Импорт и создание модулей
Допустим, мы хотим вычислить синус числа.
Встроенной функции, которая делает это, в Python нет; а писать самому - занятие ненужное. Зато такая функция есть во встроенном модуле math.
Модулем в Python называется любой файл с программой (да-да, все те программы, которые мы писали в прошлых лекциях, можно назвать модулями).
Каждая программа может подключить модуль и получить доступ к его классам, функциям и объектам.
Модуль может быть написан не только на Python, но и, например, на C или C++.
К примеру, модуль math, о котором мы говорим, написан как раз на C и имеет интерфейс для вызова из Python.
Чтобы получить доступ к функциям из этого модуля, его необходимо импортировать. Сделать это можно несколькими способами:
Инструкция import
После ключевого слова import указывается название модуля.
Одной инструкцией можно подключить несколько модулей (для этого они указываются через запятую), хотя это не рекомендуется делать, так как снижает читаемость кода. Импортируем модуль math:
import math
После импортирования модуля его название становится переменной, через которую можно получить доступ к атрибутам модуля. Теперь мы можем вычислить синус числа:
>>> import math >>> math.sin(1) 0.8414709848078965
Стоит отметить, что если указанный атрибут модуля не будет найден, возникнет исключение AttributeError. А если не удастся найти модуль для импортирования, то ModuleNotFoundError.
>>> import notexist Traceback (most recent call last): File "<stdin>", line 1, in <module> ModuleNotFoundError: No module named 'notexist' >>> import math >>> math.Ё Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: module 'math' has no attribute 'Ё'
Использование псевдонимов
Если название модуля слишком длинное, или оно вам не нравится по каким-то другим причинам, то для него можно создать псевдоним, с помощью ключевого слова as.
>>> import math as m >>> m.sin(1) 0.8414709848078965
Теперь доступ ко всем атрибутам модуля math осуществляется только с помощью переменной m, а переменной math в этой программе уже не будет (если, конечно, вы после этого не напишете import math, тогда модуль будет доступен как под именем m, так и под именем math).
Инструкция from ... import ...
Подключить только определенные атрибуты модуля можно с помощью инструкции from:
from <Название модуля> import <Атрибут 1> [ as <Псевдоним 1> ], [<Атрибут 2> [ as <Псевдоним 2> ] ...]
Эта инструкция позволяет подключить из модуля только указанные вами атрибуты. При этом сам модуль не записывается в переменную, а в глобальную область видимости добавляются те функции и объекты, которые вы импортировали. Для длинных имён также можно назначить псевдоним, указав его после ключевого слова as.
>>> from math import sin, ceil as c >>> sin(1) 0.8414709848078965 >>> c(4.6) 5
Импортируемые атрибуты можно разместить на нескольких строках, если их много, для лучшей читаемости кода:
from math import ( sin, cos, tan, atan )
Инструкция from ... import *
Второй формат инструкции from позволяет подключить все (точнее, почти все) переменные из модуля.
from math import *
Создание своего модуля на Python
Теперь пришло время создать свой модуль. Это можно сделать, просто создав файл с программой, например, назовём его mymodule.py, в котором определим какую-нибудь функцию:
def hello(): print('Hello, world!')
Теперь в этой же папке создадим другой файл, например, main.py:
import mymodule mymodule.hello()
Выведет Hello, world!.
Иии... это всё! Вы сделали свой модуль! В конце отвечу на несколько вопросов, связанных с созданием модулей.
Можно ли использовать модуль как самостоятельную программу?
Можно. Однако следует помнить, что при импортировании модуля его код выполняется полностью, то есть, если программа что-то печатает, то при её импортировании это будет напечатано.
Подобного эффекта можно избежать, если проверять, запущен ли скрипт как программа, или импортирован. Это можно сделать с помощью магической переменной __name__, которая определена в любой программе, и равна "__main__", если скрипт запущен в качестве главной программы, и имя модуля, если он импортирован. Например, mymodule.py может выглядеть вот так:
def hello(): print('Hello, world!') if __name__ == "__main__": hello()
Как назвать модуль?
Помните, что вы (или другие люди) будут его импортировать и использовать в качестве переменной.
Модуль нельзя именовать так же, как и ключевое слово:
False await else import pass None break except in raise True class finally is return and continue for lambda try as def from nonlocal while assert del global not with async elif if or yield
Имена модулей нельзя начинать с цифры
Не нужно называть модуль также, как какую-либо из встроенных функций. Технически так сделать, конечно, можно, но это создаст большие неудобства при его последующем использовании
Куда поместить модуль?
Туда, где его потом можно будет найти.
Пути поиска модулей указаны в переменной sys.path. В него включены текущая директория (то есть модуль можно оставить в папке с основной программой), а также директории, в которых установлен python.
Кроме того, переменную sys.path можно изменять вручную, что позволяет положить модуль в любое удобное для вас место (главное, не забыть в главной программе модифицировать sys.path).