Простой Python. Современный стиль программирования (Любанович) - страница 78

>>>> import sys

>>>> for place in sys.path:

>…·····print(place)

>…

>/Library/Frameworks/Python.framework/Versions/3.3/lib/python33.zip

>/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3

>/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/plat-darwin

>/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/lib-dynload

>/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/site-packages

Пустое место в начале вывода содержит в себе строку '', которая символизирует текущий каталог. Если строка '' находится первой в sys.path, Python сначала выполнит поиск в текущем каталоге, когда вы попробуете что-то импортировать: import report выглядит как report.py.

Будет использован первый найденный модуль. Это означает, что, если вы определите модуль с именем random и он будет найден раньше оригинального модуля, вы не получите доступ к стандартной библиотеке random.

Пакеты

Мы перешли от отдельных строк кода к функциям, отдельным программам и модулям, располагающимся в одной папке. Чтобы сделать еще один шаг, вы можете организовать модули в иерархии файлов, которые называются пакетами.

Возможно, нам нужны разные типы прогнозов погоды: на следующий день и следующую неделю. В качестве одного из вариантов мы можем создать папку с именем sources, а внутри нее — два модуля: daily.py и weekly.py. Каждый из них содержит функцию forecast. Версия на каждый день возвращает строку, а версия на каждую неделю — список из семи строк.

Рассмотрим основную программу и два модуля. (Функция enumerate() разбивает список на части и отправляет каждый элемент списка в цикл for, добавляя к каждому элементу число в качестве небольшого бонуса.)

Основная программа — boxes/weather.py:

>from sources import daily, weekly

>print("Daily forecast: ", daily.forecast())

>print("Weekly forecast: ")

>for number, outlook in enumerate(weekly.forecast(), 1):

>····print(number, outlook)

>Модуль 1: boxes/sources/daily.py.

>def forecast():

>····'fake daily forecast'

>····return 'like yesterday'

>Модуль 2: boxes/sources/weekly.py.

>def forecast():

>····"""Fake weekly forecast"""

>····return ['snow', 'more snow', 'sleet',

>········'freezing rain', 'rain', 'fog', 'hail']

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

Запустите основную программу weather.py, чтобы увидеть, что произойдет:

>$ python weather.py

>Daily forecast: like yesterday

>Weekly forecast:

>1 snow

>2 more snow

>3 sleet

>4 freezing rain

>5 rain