Модули Python

Модуль Python — это файл Python с расширением .py, который содержит определения объектов Python и инструкции Python.

Модули позволяют логически организовывать разделы вашего кода Python.

Объединение связанного кода в модуль делает ваш код более удобным для использования и более понятным.

Модули могут определять функции, классы и переменные, а также могут содержать исполняемый код.

Пример

Ниже приведён простой модуль support.py:

Модуль support.py:

def print_func( par ): print "Hello : ", par return

инструкция import

Импорт модулей

После того как модуль определён, мы можем использовать инструкцию import для импорта модуля. Синтаксис следующий:

import module1[, module2[,... moduleN]]

Например, чтобы обратиться к модулю math, вы можете использовать следующее в самом начале файла:import mathчтобы импортировать его. При вызове функций в модуле math вы должны обращаться к нему так:

Module name.function name

Когда интерпретатор встречает инструкцию import, модуль будет импортирован, если он находится в текущем пути поиска.

Путь поиска — это список всех каталогов, которые интерпретатор будет искать по порядку. Если вы хотите импортировать модуль support.py, нужно поместить команду в начало скрипта:

Код файла test.py:

#!/usr/bin/python # -*- coding: UTF-8 -*- # импорт модуля import support # Теперь вы можете вызывать функции, содержащиеся в модуле support.print_func("Пример")

Вывод приведенного выше примера:

Hello : Example

Модуль импортируется только один раз, сколько бы раз вы ни выполняли import. Это предотвращает повторное выполнение импортированного модуля снова и снова.



Инструкция from…import

Инструкция from в Python позволяет импортировать определённую часть из модуля в текущее пространство имён. Синтаксис следующий:

from modname import name1[, name2[, ... nameN]]

Например, чтобы импортировать функцию fibonacci из модуля fib, используйте следующую инструкцию:

from fib import fibonacci

Этот оператор не импортирует весь модуль fib в текущее пространство имён; он импортирует только функцию fibonacci из fib в глобальную таблицу символов модуля, выполняющего этот оператор.



Оператор from…import *

Также можно импортировать всё содержимое модуля в текущее пространство имён. Просто используйте следующее объявление:

from modname import *

Это даёт простой способ импортировать все элементы из модуля. Однако этим объявлением не следует злоупотреблять.

Например, если мы хотим импортировать всё из модуля math сразу, оператор выглядит так:

from math import *

Путь поиска

Когда вы импортируете модуль, интерпретатор Python ищет расположение модуля в следующем порядке:

  • 1. Текущий каталог
  • 2. Если его нет в текущем каталоге, Python ищет в каждом каталоге, указанном в переменной оболочки PYTHONPATH.
  • 3. Если он нигде не найден, Python проверяет путь по умолчанию. В UNIX путь по умолчанию обычно /usr/local/lib/python/.

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



Переменная PYTHONPATH

Как переменная среды, PYTHONPATH состоит из множества каталогов, содержащихся в списке. Синтаксис PYTHONPATH такой же, как у переменной оболочки PATH.

В системах Windows типичный PYTHONPATH выглядит следующим образом:

set PYTHONPATH=c:\python27\lib;

В системах UNIX типичный PYTHONPATH выглядит следующим образом:

set PYTHONPATH=/usr/local/lib/python


Пространства имён и область видимости

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

Выражение Python может обращаться к переменным как в локальном пространстве имён, так и в глобальном пространстве имён. Если локальная и глобальная переменные имеют одинаковое имя, локальная переменная переопределяет глобальную переменную.

Каждая функция имеет собственное пространство имён. Правила области видимости для методов класса такие же, как для обычных функций.

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

Следовательно, если вы хотите присвоить значение глобальной переменной внутри функции, необходимо использовать инструкцию global.

Выражение global VarName сообщает Python, что VarName — глобальная переменная, поэтому Python не будет искать эту переменную в локальном пространстве имён.

Например, мы определяем переменную Money в глобальном пространстве имён. Затем мы присваиваем значение Money внутри функции, и Python предполагает, что Money — локальная переменная. Однако, поскольку мы не объявили локальную переменную Money перед обращением к ней, возникнет UnboundLocalError. Удаление символа комментария перед инструкцией global может решить эту проблему.

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
Money = 2000
def AddMoney():
   # 想改正代码就取消以下注释:
   # global Money
   Money = Money + 1
 
print Money
AddMoney()
print Money


Функция dir()

Функция dir() возвращает отсортированный список строк, содержащих имена, определённые в модуле.

Возвращённый список содержит все модули, переменные и функции, определённые в модуле. Вот простой пример:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
# 导入内置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, состоящую из модулей, подпакетов и подпакетов внутри подпакетов, и так далее.

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

Рассмотримpackage_exampleв каталогеexample1.py、example2.py、__init__.py файл, test.py — это код для тестирования вызова пакета, структура каталогов выглядит следующим образом:

test.py
package_example
|-- __init__.py
|-- example1.py
|-- example2.py
Исходный код выглядит следующим образом:

package_example/example1.py

#!/usr/bin/python # -*- coding: UTF-8 -*- def example1(): print "I'm in example1"

package_example/example2.py

#!/usr/bin/python # -*- coding: UTF-8 -*- def example2(): print "I'm in example2"

Теперь вpackage_exampleсоздайте в каталоге__init__.py:

package_example/__init__.py

#!/usr/bin/python # -*- coding: UTF-8 -*- if __name__ == '__main__': print 'запускается как основная программа' else: print 'инициализация package_example'

Затем мыpackage_example в каталоге того же уровнясоздаем test.py ниже, чтобы вызватьpackage_exampleПакет

test.py

#!/usr/bin/python # -*- coding: UTF-8 -*- # импорт пакета Phone from package_example.example1 import example1 from package_example.example2 import example2 example1() example2()

Вывод приведенного выше примера:

package_example 初始化
I'm in example1
I'm in example2

Как показано выше, для иллюстрации мы разместили только одну функцию в каждом файле, но на самом деле вы можете разместить много функций. Вы также можете определить классы Python в этих файлах, а затем создать пакет для этих классов.

Другие расширения