======Работа с модулями====== Модулем в Python называется любой файл с программой (да-да, все те программы, которые вы писали, можно назвать модулями). В этой статье мы поговорим о том, как создать модуль, и как подключить модуль, из стандартной библиотеки или написанный вами. Каждая программа может импортировать модуль и получить доступ к его классам, функциям и объектам. Нужно заметить, что модуль может быть написан не только на Python, а например, на C или C++. ====Подключение модуля из стандартной библиотеки==== Подключить модуль можно с помощью инструкции **import**. К примеру, подключим модуль os для получения текущей директории: >>> >>> import os >>> os.getcwd() 'C:\\Python33' После ключевого слова **import** указывается название модуля. Одной инструкцией можно подключить несколько модулей, хотя этого не рекомендуется делать, так как это снижает читаемость кода. Импортируем модули **time** и **random**. >>> >>> import time, random >>> time.time() 1376047104.056417 >>> random.random() 0.9874550833306869 После импортирования модуля его название становится переменной, через которую можно получить доступ к атрибутам модуля. Например, можно обратиться к константе e, расположенной в модуле math: >>> >>> import math >>> math.e 2.718281828459045 Стоит отметить, что если указанный атрибут модуля не будет найден, возбудится исключение AttributeError. А если не удастся найти модуль для импортирования, то ImportError. >>> >>> import notexist Traceback (most recent call last): File "", line 1, in import notexist ImportError: No module named 'notexist' >>> import math >>> math.Ё Traceback (most recent call last): File "", line 1, in math.Ё AttributeError: 'module' object has no attribute 'Ё' ====Использование псевдонимов==== Если название модуля слишком длинное, или оно вам не нравится по каким-то другим причинам, то для него можно создать псевдоним, с помощью ключевого слова **as**. >>> >>> import math as m >>> m.e 2.718281828459045 Теперь доступ ко всем атрибутам модуля math осуществляется только с помощью переменной m, а переменной math в этой программе уже не будет (если, конечно, вы после этого не напишете import math, тогда модуль будет доступен как под именем m, так и под именем math). ====Инструкция from==== Подключить определенные атрибуты модуля можно с помощью инструкции **from**. Она имеет несколько форматов: from <Название модуля> import <Атрибут 1> [ as <Псевдоним 1> ], [<Атрибут 2> [ as <Псевдоним 2> ] ...] from <Название модуля> import * Первый формат позволяет подключить из модуля только указанные вами атрибуты. Для длинных имен также можно назначить псевдоним, указав его после ключевого слова **as**. >>> >>> from math import e, ceil as c >>> e 2.718281828459045 >>> c(4.6) 5 Импортируемые атрибуты можно разместить на нескольких строках, если их много, для лучшей читаемости кода: >>> >>> from math import (sin, cos, ... tan, atan) Второй формат инструкции from позволяет подключить все (точнее, почти все) переменные из модуля. Для примера импортируем все атрибуты из модуля sys: >>> >>> from sys import * >>> version '3.3.2 (v3.3.2:d047928ae3f6, May 16 2013, 00:03:43) [MSC v.1600 32 bit (Intel)]' >>> version_info sys.version_info(major=3, minor=3, micro=2, releaselevel='final', serial=0) Следует заметить, что не все атрибуты будут импортированы. Если в модуле определена переменная __all__ (список атрибутов, которые могут быть подключены), то будут подключены только атрибуты из этого списка. Если переменная __all__ не определена, то будут подключены все атрибуты, не начинающиеся с нижнего подчёркивания. Кроме того, необходимо учитывать, что импортирование всех атрибутов из модуля может нарушить пространство имен главной программы, так как переменные, имеющие одинаковые имена, будут перезаписаны. ====Создание своего модуля на Python==== Теперь пришло время создать свой модуль. Создадим файл mymodule.py, в которой определим какие-нибудь функции: def hello(): print('Hello, world!') def fib(n): a = b = 1 for i in range(n - 2): a, b = b, a + b return b Теперь в этой же папке создадим другой файл, например, main.py: import mymodule mymodule.hello() print(mymodule.fib(10)) Выведет: Hello, world! 55 Поздравляю! Вы сделали свой модуль! Напоследок отвечу ещё на пару вопросов, связанных с созданием модулей: ====Как назвать модуль?==== Помните, что вы (или другие люди) будут его импортировать и использовать в качестве переменной. Модуль нельзя именовать также, как и ключевое слово (их список можно посмотреть тут). Также имена модулей нельзя начинать с цифры. И не стоит называть модуль также, как какую-либо из встроенных функций. То есть, конечно, можно, но это создаст большие неудобства при его последующем использовании. ====Куда поместить модуль?==== Туда, где его потом можно будет найти. Пути поиска модулей указаны в переменной sys.path. В него включены текущая директория (то есть модуль можно оставить в папке с основной программой), а также директории, в которых установлен python. Кроме того, переменную sys.path можно изменять вручную, что позволяет положить модуль в любое удобное для вас место (главное, не забыть в главной программе модифицировать sys.path). ====Можно ли использовать модуль как самостоятельную программу?==== Можно. Однако надо помнить, что при импортировании модуля его код выполняется полностью, то есть, если программа что-то печатает, то при её импортировании это будет напечатано. Этого можно избежать, если проверять, запущен ли скрипт как программа, или импортирован. Это можно сделать с помощью переменной __name__, которая определена в любой программе, и равна "__main__", если скрипт запущен в качестве главной программы, и имя, если он импортирован. Например, mymodule.py может выглядеть вот так: main.py from app.libs import custom_sum, get_names print(custom_sum(1, 3)) libs.py def custom_sum(a, b): """ Возвращаем сумму аргументов a и b :param a параметр а :type a: int :param b параметр b :type b: int :return:return type int """ return a + b def get_names(names): """ get_names :param names: :return:return type list """ return [i for i in names if len(i) == 4] if __name__ == '__main__': print('hello') вывод: >>4 hello - не будет напечатано из за проверки if __name__ == '__main__':