Модули


Модули позволяют структурировать программы, упростить повторное использование кода, избежать конфликтов имен. Python содержит огромную коллекцию модулей (стандартная библиотека). Модули можно объединять в пакеты. Для получения доступа к атрибутам модуля, его необходимо импортировать. Импортирование осуществляется с помощью оператора import. Можно использовать две формы этого оператора import и from-import. В первом случае в глобальное пространство имен импортируется имя модуля, поэтому при доступе к атрибуту необходимо записывать имя модуля и через точку имя атрибута. Второй вариант импортирует в глобальное пространство имен имя атрибута, что позволяет обращаться к нему напрямую. Оба варианта загружают весь модуль целиком. При импорте можно связать атрибут с другим именем. Для получения прямого доступа ко всем атрибутам модуля можно использовать знак *.




>>> import math
>>> print math.sin(0)
0.0
>>> print math.cos(0)
1.0
>>>









>>> from math import sin
>>> sin(0)
0.0








 




>>> from math import sin as mysin
>>> mysin(0)
0.0
>>>




 




>>> from math import *
>>> sin(0), cos(0)
(0.0, 1.0)
>>>






Для избежания конфликтов имен желательно как можно меньше использовать инструкцию from. Для обновления модуля можно использовать функцию reload.

У каждого модуля существует встроенный атрибут __name__, который позволяет использовать файл в качестве модуля и в качестве исполняемого файла. Если файл выполняется, то атрибуту __name__ присваивается значение __main__. Если файл используется как модуль, то атрибуту __name__ присваивается имя модуля. Например, создадим файл test.py, содержащий




def hello():
print 'Hello, World!'

if __name__ == '__main__':
hello()




Этот файл можно использовать как модуль




$ python
>>> import test
>>> test.hello()
Hello, World!
>>>




и как отдельную программу




$ python test.py
Hello, World!




 



Пакеты


Пакеты позволяют организовать структурирование модулей. Фактически пакет — это каталог, содержащий подкаталоги (подпакеты), внутри которых находятся модули. Доступ к модулям осуществляется с использованием точки. Например, пакет package имеет следующую структуру




package/
__init__.py
module1.py
module2.py
module3.py

package1/
__init__.py
module11.py
module12.py
module13.py

package2/
__init__.py
module21.py
module22.py
module23.py

package3/
__init__.py
module31.py
module32.py
module33.py






Если необходимо получить доступ к функции myfunc(), находящейся в файле module33.py, то для импорта можно использовать команду




import package.package3.module33.myfunc()






Каждый каталог, являющийся пакетом, должен содержать файл __init__.py. Программный код этого файла автоматически запускается при импорте пакета в первый раз.