Импорт и создание модулей

Допустим, мы хотим вычислить синус числа.

Встроенной функции, которая делает это, в 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 позволяет подключить все (точнее, почти все) переменные из модуля.

Данным способом импортируются только атрибуты, определённые в переменной __all__ у модуля (если создатель модуля об этом побеспокоился). Или только те атрибуты, которые не начинаются с _ (это соглашение о "скрытых" переменных, его мы рассмотрим в дальнейших лекциях).
from math import *
С данным способом нужно быть крайне аккуратным. Имена в модуле, совпадающие с именами в главной программе, во время импорта инструкцией from будут перезаписаны (и наоборот, переменные в главной программе будут перезаписывать функции с такими же названиями из импортированного модуля). И в целом, забивать пространство имён - не самая удачная идея.

Создание своего модуля на 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).