Python 3 — Модули

Модуль позволяет логически организованный код на Python. Группировка связанного кода в модуль делает код проще для понимания и использования. Модуль представляет собой объект Python с произвольно названными атрибутами, которые могут связать и ссылка.
Проще говоря, модуль представляет собой файл, состоящий из кода Python. Модуль может определить функции, классы и переменные. Модуль может также включать в себя работоспособный код.
Пример
Код Python для модуля с именем aname обычно находится в файле namedaname.py. Вот пример простого модуля, support.py:
def print_func( par ): print "Hello : ", par return
Заявление import
Вы можете использовать любой исходный файл Python как модуль, выполнив оператор import: в исходном файле Python. import имеет следующий синтаксис:
import module1[, module2[,... moduleN]
Когда интерпретатор встречает оператор import, он импортирует модуль, если модуль присутствует в пути поиска. Путь поиска представляет собой список каталогов, в которых интерпретатор ищет, прежде чем импортировать модуль. Например, чтобы импортировать модуль hello.py, необходимо поместить следующую команду в верхней части сценария:
#!/usr/bin/python3 # Поддержка импорта модуля import support # Теперь можно вызвать определенную функцию этого модуля следующим образом support.print_func("AndreyEx")
Когда этот код выполниться, он произведет следующий результат:
Hello : AndreyEx
Модуль загружается только один раз, независимо от того, сколько раз он импортируется. Это предотвращает выполнение модуля несколько раз, если происходит несколько импортов.
Заявление from … import
Python из личных данных позволяет импортировать определенные атрибуты из модуля в текущее пространство имен. from … import имеет следующий синтаксис:
from modname import name1[, name2[, ... nameN]]
Например, чтобы импортировать функцию Fibonacci из модуля fib, используйте следующее заявление:
#!/usr/bin/python3 # Модуль числа Фибоначчи def fib(n): # возврат серии Фибоначчи до n result = [] a, b = 0, 1 while b < n: result.append(b) a, b = b, a + b return result >>> from fib import fib >>> fib(100) [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
Это утверждение не импортирует весь модуль fib в текущее пространство имен; он просто вводит пункт Фибоначчи модуля fib в глобальную таблицу символов модуля импорта.
Заявление from … import *
Кроме того, можно импортировать все имена из модуля в текущее пространство имен, используя следующий оператор импорта:
from modname import *
Это обеспечивает легкий способ импортировать все элементы из модуля в текущее пространство имен; Однако, это утверждение следует использовать с осторожностью.
Выполнение модулей в качестве сценариев
Внутри модуля, имя модуля (в виде строки) доступно в качестве значения глобальной переменной __name__. Код в модуле будет выполняться так же, как если вы импортировали его, но с __name__ установлен в положение «__main__».
Добавьте этот код в конце вашего модуля:
#!/usr/bin/python3 # Модуль числа Фибоначчи def fib(n): # возврат серии Фибоначчи до n result = [] a, b = 0, 1 while b < n: result.append(b) a, b = b, a + b return result if __name__ == "__main__": f = fib(100) print(f)
При выполнении приведенного выше кода, будет отображаться следующий вывод.
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
Расположение модулей
При импорте модуля, ведется поиск интерпретатора Python для модуля в следующей последовательности:
- Текущий каталог.
- Если модуль не найден, Python ищет каждый каталог в переменную оболочки PYTHONPATH.
- Если все остальное терпит неудачу, Python проверяет путь по умолчанию. В UNIX, этот путь по умолчанию, как правило, /usr/local/lib/python3/.
Модуль поиска пути хранится в модуле системы SYS в переменной sys.path. Переменная sys.path содержит текущий каталог, PYTHONPATH, и установки в зависимости от значения по умолчанию.
Переменная PYTHONPATH
PYTHONPATH это переменная окружения, состоящее из списка каталогов. Синтаксис PYTHONPATH такой же, как и у переменной оболочки PATH.
Вот типичный PYTHONPATH из системы Windows:
set PYTHONPATH = c:\python34\lib;
А вот типичный PYTHONPATH из системы UNIX:
set PYTHONPATH = /usr/local/lib/python
Обзор пространства имен
Переменные имена (идентификаторы), которые ссылаются на объекты. namespace является словарем имен переменных (ключи) и их соответствующих объектов (ценности).
- Оператор Python может получить доступ к переменной в local namespace и в global namespace. Если локальная и глобальная переменная имеет то же имя, локальная переменная замещает глобальную переменную.
- Каждая функция имеет свое собственное локальное пространство имен. Методы класса следуют тому же правилу области действия, что и обычные функции.
- Python делает обоснованные предположения о том, какие переменные являются локальными или глобальными. Он предполагает, что любой переменной, которой присваивается значение функции является локальным.
- Поэтому для того, чтобы присвоить значение глобальной переменной внутри функции, вы должны сначала использовать глобальное заявление.
- Оператор statement global VarName говорит Python, что VarName является глобальной переменной. Python прекращает поиск в локальном пространство имен для переменной.
Например, мы определяем переменную Money в глобальном пространстве имен. В функции Money, мы относим значение Money, поэтому Python принимает Money в качестве локальной переменной.
Тем не менее, мы получили доступ к значению локальных переменных Money перед его установкой, так что результат UnboundLocalError. Раскомментированное глобальное заявление устраняет проблему.
#!/usr/bin/python3 Money = 2000 def AddMoney(): # Раскомментируйте следующую строку, чтобы исправить код: # global Money Money = Money + 1 print (Money) AddMoney() print (Money)
Функция dir()
Встроенная функция dir() возвращает отсортированный список строк, содержащих имена, определенные в модуле.
Список содержит имена всех модули, переменных и функций, определенные в модуле. Ниже приведен простой пример:
#!/usr/bin/python3 # Импорт встроенного модуля 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() импортирует ранее импортированный модуль снова. Синтаксис функции reload() следующий:
reload(module_name)
Здесь module_name это имя модуля, который вы хотите перезагрузить, а не строка, содержащая имя модуля. Например, чтобы перезагрузить модуль hello, выполните следующие действия:
reload(hello)
Пакеты в Python
Пакет представляет собой иерархическую структуру каталогов с файлами, который определяет единую среду приложений на языке Python, который состоит из модулей и подпакетов и с подразделами подпакетов, и так далее.
Рассмотрим файл Pots.py доступный в каталоге phone. Этот файл имеет следующую строку исходного кода:
#!/usr/bin/python3 def Pots(): print ("У меня есть телефон")
Похоже, у нас есть два других файла, имеющие различные функции с тем же именем, что и выше. Это:
- файл 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/python3 # Теперь импортируйте пакет Phone. import Phone Phone.Pots() Phone.Isdn() Phone.G3()
Когда этот код выполниться, он произведет следующий результат:
I'm Pots Phone I'm 3G Phone I'm ISDN Phone
В приведенном выше примере, мы взяли пример из одной функции в каждом файле, но вы можете сохранить несколько функций в файлах. Вы также можете определить различные классы Python в этих файлах, а затем вы можете создавать свои пакеты из этих классов.