Освой Python играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Python: Модули

from
Создание собственного модуля

Для создания модуля нужно создать файл с расширением py, содержащий функции и переменные. Другой способ – написать модуль на другом языке программирования, например, можно писать модули на языке C, которые после компиляции могут использоваться стандартным интерпретатором Python.

Модуль можно импортировать в другую программу, чтобы использовать функции из него. Посмотрим, как использовать модули стандартной библиотеки Python.


import sys

print('Аргументы командной строки:')
for i in sys.argv:
  print(i)
  
print('\n\nПеременная PYTHONPATH содержит', sys.path, '\n')

В начале мы импортируем модуль sys командой import. Этим мы говорим Python, что хотим использовать этот модуль. Модуль sys содержит функции, относящиеся к интерпретатору Python и его среде, т.е. к системе (system).

Когда Python выполняет команду import sys, он ищет модуль sys. В данном случае это один из встроенных модулей, и Python знает, где его искать.

Если бы это был не скомпилированный модуль, т.е. модуль, написанный на Python, тогда интерпретатор Python искал бы его в каталогах, перечисленных в переменной sys.path. Если модуль найден, выполняются команды в теле модуля, и он становится доступным. Обратите внимание, что инициализация происходит только при первом импорте модуля.

Доступ к переменной argv в модуле sys предоставляется при помощи точки, т.е. sys.argv. Это явно показывает, что это имя является частью модуля sys. Ещё одним преимуществом такого обозначения является то, что имя не конфликтует с именем переменной argv, которая может использоваться в вашей программе.

Переменная sys.argv является списком строк. Она содержит список аргументов командной строки, т.е. аргументов, переданных программе из командной строки.

sys.path содержит список имён каталогов, откуда импортируются модули. Модули, расположенные в текущем каталоге, можно импортировать напрямую. В противном случае придётся поместить свой модуль в один из каталогов, перечисленных в sys.path.

Помните, что текущий каталог – это каталог, в котором была запущена программа. Чтобы узнать текущий каталог программы, выполните сценарий.


import os

print(os.getcwd())

Одной инструкцией можно подключить несколько модулей, хотя так не рекомендуется делать.


import time, random

Если не удастся найти модуль для импортирования, то возбудится исключение ImportError. Если не будет найден указанный атрибут модуля, то возбудится исключение AttributeError.

Если название модуля слишком длинное, или оно вам не нравится по каким-то другим причинам, то для него можно создать псевдоним, с помощью ключевого слова as.


import math as cat
print(cat.floor(4.7))

from

Для импорта всех имён, использующихся в модуле, можно выполнить команду from:


from sys import *

Следует заметить, что не все атрибуты будут импортированы. Если в модуле определена переменная __all__ (список атрибутов, которые могут быть подключены), то будут подключены только атрибуты из этого списка. Если переменная __all__ не определена, то будут подключены все атрибуты, не начинающиеся с нижнего подчёркивания. Кроме того, необходимо учитывать, что импортирование всех атрибутов из модуля может нарушить пространство имён главной программы, так как переменные, имеющие одинаковые имена, будут перезаписаны.

Можно указывать отдельные переменные из модуля.

from sys import argv

У каждого модуля есть имя, и команды в модуле могут узнать имя их модуля. Это полезно, когда нужно знать, запущен ли модуль как самостоятельная программа или импортирован. Когда модуль импортируется впервые, содержащийся в нём код исполняется. Мы можем воспользоваться этим для того, чтобы заставить модуль вести себя по-разному в зависимости от того, используется ли он сам по себе или импортируется в другую программу. Этого можно достичь с применением атрибута модуля под названием __name__.


if __name__ == '__main__':
  print('Эта программа запущена сама по себе.')
else:
  print('Меня импортировали в другой модуль.')

Создание собственного модуля

Создать собственный модуль очень легко. Каждая программа на Python также является и модулем. Необходимо лишь убедиться, что у неё установлено расширение py. Создадим файл mymodule.py.


def sayhi():
  print('Привет! Это говорит мой модуль.')
  
__version__ = '0.1'

Как использовать созданный модуль в других программах? Помните, что модуль должен находиться либо в том же каталоге, что и программа, в которую мы импортируем его, либо в одном из каталогов, указанных в sys.path.

Создадим новый файл и импортируем наш модуль.


import mymodule

mymodule.sayhi()
print('Version', mymodule.__version__)

Другой способ импортирования.


from mymodule import sayhi, __version__

sayhi()
print('Version', __version__)

Обратите внимание, что если в модуле, импортирующем данный модуль, уже было объявлено имя __version__, возникнет конфликт. Поэтому всегда рекомендуется отдавать предпочтение оператору import, хотя это и сделает программу немного длиннее.

Вариант со звёздочкой имеет свои особенности - это импортирует все публичные имена, такие как sayhi, но не импортирует __version__, потому что оно начинается с двойного подчёркивания.


from mymodule import *

Встроенная функция dir() поможет узнать список имён, определяемых объектом. Например, можно получить список функций, классов и переменных, входящих в модуль. Функция может принимать аргументы. Если в качестве аргумента указано имя модуля, она возвращает список имён, определённых в этом модуле. Если никакого аргумента не передавать, она вернёт список имён, определённых в текущем модуле.

Функция dir() применима к функциям и классам. Выполните dir('print'), чтобы увидеть атрибуты функции print, или dir(str), чтобы увидеть атрибуты класса str.

Пакеты

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

Импорт модуля – относительно дорогостоящее мероприятие, поэтому Python предпринимает некоторые шаги для ускорения этого процесса. Один из способов – создать байткод с расширением pyc, которые являются некой промежуточной формой, в которую Python переводит программу. Такой файл полезен при импорте модуля в следующий раз в другую программу – это произойдёт намного быстрее, поскольку значительная часть обработки, требуемой при импорте модуля, будет уже проделана. Этот байткод также является платформонезависимым. Обычно файлы pyc создаются в том же каталоге, где расположены и соответствующие им файлы py. Если Python не может получить доступ для записи файлов в этот каталог, файлы pyc созданы не будут.

Реклама