>>>> 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