Модули в Python: организация кода для ясности и повторного использования
Что такое модуль в Python?
Модуль позволяет логически организовать ваш код на Python. Группировка связанного кода в модуль делает его более понятным и удобным для использования. Модуль — это объект Python с произвольно именованными атрибутами, к которым можно привязываться и ссылаться.
Простыми словами, модуль — это файл, содержащий код Python. Модуль может определять функции, классы и переменные. Также модуль может включать исполняемый код.
Пример модуля
Код Python для модуля с именем aname обычно находится в файле aname.py. Вот пример простого модуля support.py:
def print_func(par):
print("Hello : ", par)
return
Оператор import
Вы можете использовать любой исходный файл Python как модуль, выполнив оператор import в другом исходном файле Python. Синтаксис import выглядит следующим образом:
import module1[, module2[, ... moduleN]]
Когда интерпретатор встречает оператор import, он импортирует модуль, если тот присутствует в пути поиска. Путь поиска — это список директорий, которые интерпретатор проверяет перед импортом модуля. Например, чтобы импортировать модуль support.py, нужно поместить следующую команду в начало скрипта:
#!/usr/bin/python
# Импорт модуля support
import support
# Теперь можно вызывать функцию, определенную в модуле
support.print_func("Zara")
При выполнении вышеуказанного кода получим следующий результат:
Hello : Zara
Модуль загружается только один раз, независимо от количества импортов. Это предотвращает многократное выполнение кода модуля при повторных импортах.
Оператор from...import
Оператор from в Python позволяет импортировать конкретные атрибуты из модуля в текущее пространство имен. Синтаксис:
from modname import name1[, name2[, ... nameN]]
Например, для импорта функции fibonacci из модуля fib используйте:
from fib import fibonacci
Этот оператор не импортирует весь модуль fib в текущее пространство имен; он лишь вводит элемент fibonacci из модуля fib в глобальную таблицу символов импортирующего модуля.
Оператор from...import *
Также можно импортировать все имена из модуля в текущее пространство имен с помощью следующего оператора:
from modname import *
Это удобный способ импорта всех элементов модуля, однако его следует использовать с осторожностью, чтобы не загрязнять пространство имен.
Поиск модулей
При импорте модуля интерпретатор Python ищет его в следующей последовательности:
Текущая директория.
Если модуль не найден, Python ищет в каждой директории, указанной в переменной окружения
PYTHONPATH.Если ничего не помогло, Python проверяет путь по умолчанию. В UNIX это обычно
/usr/local/lib/python/.
Путь поиска модулей хранится в системном модуле sys как переменная sys.path. Она содержит текущую директорию, PYTHONPATH и установку по умолчанию.
Переменная PYTHONPATH
PYTHONPATH — это переменная окружения, состоящая из списка директорий. Синтаксис такой же, как у переменной оболочки PATH.
Типичный PYTHONPATH для Windows:
set PYTHONPATH = c:\python20\lib;
Типичный PYTHONPATH для UNIX:
set PYTHONPATH = /usr/local/lib/python
Пространства имен и области видимости
Переменные — это имена (идентификаторы), отображающиеся на объекты. Пространство имен — это словарь имен переменных (ключей) и соответствующих им объектов (значений).
Оператор Python может обращаться к переменным в локальном пространстве имен и в глобальном пространстве имен. Если локальная и глобальная переменные имеют одно имя, локальная переменная перекрывает глобальную.
У каждой функции есть собственное локальное пространство имен. Методы классов следуют тем же правилам области видимости, что и обычные функции.
Python делает предположения о том, являются ли переменные локальными или глобальными. Он предполагает, что любая переменная, которой присваивается значение в функции, является локальной.
Поэтому, чтобы присвоить значение глобальной переменной внутри функции, нужно сначала использовать оператор global.
Оператор global VarName сообщает Python, что VarName — глобальная переменная. Python прекращает поиск переменной в локальном пространстве имен.
Например, определим переменную Money в глобальном пространстве имен. Внутри функции Money мы присваиваем Money значение, поэтому Python считает Money локальной переменной. Однако мы обращаемся к значению локальной переменной Money до её установки, что вызывает UnboundLocalError. Раскомментирование оператора global решает проблему.
#!/usr/bin/python
Money = 2000
def AddMoney():
# Раскомментируйте следующую строку, чтобы исправить код:
# global Money
Money = Money + 1
print(Money)
AddMoney()
print(Money)
Функция dir()
Встроенная функция dir() возвращает отсортированный список строк, содержащий имена, определенные модулем.
Список включает имена всех модулей, переменных и функций, определенных в модуле. Простой пример:
#!/usr/bin/python
# Импорт встроенного модуля math
import math
content = dir(math)
print(content)
Результат выполнения:
['__doc__', '__file__', '__name__', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'cosh', 'degrees', 'e', 'exp', 'fabs', 'floor', 'fmod', 'frexp', 'hypot', 'ldexp', 'log', 'log10', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh']
Здесь специальная строковая переменная __name__ — это имя модуля, а __file__ — имя файла, из которого модуль был загружен.
Функции globals() и locals()
Функции globals() и locals() возвращают имена в глобальном и локальном пространствах имен в зависимости от места вызова.
Если
locals()вызвана внутри функции, она вернет все имена, доступные локально из этой функции.Если
globals()вызвана внутри функции, она вернет все имена, доступные глобально из этой функции.
Тип возвращаемого значения обеих функций — словарь. Поэтому имена можно извлечь с помощью метода keys().
Функция reload()
Когда модуль импортируется в скрипт, код в верхней части модуля выполняется только один раз.
Если вы хотите повторно выполнить код верхнего уровня в модуле, можно использовать функцию reload(). Она импортирует ранее импортированный модуль снова. Синтаксис:
reload(module_name)
Здесь module_name — имя модуля, который нужно перезагрузить, а не строка с именем. Например, для перезагрузки модуля hello:
reload(hello)
Пакеты в Python
Пакет — это иерархическая структура файлового каталога, определяющая единую среду приложения Python, состоящую из модулей, подпакетов и так далее.
Рассмотрим файл Pots.py в директории Phone со следующим кодом:
#!/usr/bin/python
def Pots():
print("I'm Pots Phone")
Аналогично, есть два других файла с функциями тех же имен:
Phone/Isdn.pyс функциейIsdn()Phone/G3.pyс функциейG3()
Теперь создадим файл __init__.py в директории Phone:
Phone/__init__.py
Чтобы все функции были доступны при импорте Phone, нужно добавить явные операторы импорта в __init__.py:
from Pots import Pots
from Isdn import Isdn
from G3 import G3
После добавления этих строк в __init__.py все классы станут доступны при импорте пакета Phone:
#!/usr/bin/python
# Теперь импортируем пакет Phone
import Phone
Phone.Pots()
Phone.Isdn()
Phone.G3()
Результат выполнения:
I'm Pots Phone
I'm 3G Phone
I'm ISDN Phone
В примере использовались одиночные функции в каждом файле, но вы можете хранить множество функций. Также можно определять разные классы Python в этих файлах и создавать пакеты из этих классов.
Python
- Освоение типов данных в Python: практическое руководство
- Мастерство ввода-вывода и импорта модулей в Python: Практическое руководство
- Мастерство операторов Python: Полное руководство
- Аргументы функций в Python: позиционные, именованные и параметры по умолчанию
- Модули в Python: создание, импорт и продвинутое использование
- Словари в Python: создание, манипуляции и продвинутые техники
- Итераторы в Python: как они работают и как создать свои
- Замыкания в Python: как вложенные функции захватывают переменные
- Модуль datetime в Python: практическое руководство по датам, времени и часовым поясам
- Освоение модуля time в Python: функции, структуры и практические примеры