Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> Python

Модули в 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 ищет его в следующей последовательности:

Путь поиска модулей хранится в системном модуле 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() возвращают имена в глобальном и локальном пространствах имен в зависимости от места вызова.

Тип возвращаемого значения обеих функций — словарь. Поэтому имена можно извлечь с помощью метода 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")

Аналогично, есть два других файла с функциями тех же имен:

Теперь создадим файл __init__.py в директории Phone:

Чтобы все функции были доступны при импорте 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

  1. Освоение типов данных в Python: практическое руководство
  2. Мастерство ввода-вывода и импорта модулей в Python: Практическое руководство
  3. Мастерство операторов Python: Полное руководство
  4. Аргументы функций в Python: позиционные, именованные и параметры по умолчанию
  5. Модули в Python: создание, импорт и продвинутое использование
  6. Словари в Python: создание, манипуляции и продвинутые техники
  7. Итераторы в Python: как они работают и как создать свои
  8. Замыкания в Python: как вложенные функции захватывают переменные
  9. Модуль datetime в Python: практическое руководство по датам, времени и часовым поясам
  10. Освоение модуля time в Python: функции, структуры и практические примеры