Главная страница
Навигация по странице:

  • 2. Компиляция (если необходимо)

  • Стороннее программное обеспечение: distutils

  • Закрепление пройденного Контрольные вопросы

  • Создание модуля

  • Математический анализ. 3е издание


    Скачать 4.86 Mb.
    Название3е издание
    АнкорМатематический анализ
    Дата04.02.2022
    Размер4.86 Mb.
    Формат файлаpdf
    Имя файлаpython_01.pdf
    ТипДокументы
    #351981
    страница60 из 98
    1   ...   56   57   58   59   60   61   62   63   ...   98

    Файл с байткодом, имеющий имя b.pyc.

    Содержимое каталога b, при импортировании пакета (описывается в главе 20).

    Скомпилированный модуль расширения, как правило, написанный на языке C или C++ и динамически присоединенный при импорте
    (например, b.so в Linux и b.dll или b.pyd в Cygwin и в Windows).

    Скомпилированный встроенный модуль, написанный на языке C
    и статически скомпонованный с интерпретатором Python.

    Файл ZIPархива с компонентом, который автоматически извлека
    ется при импорте.

    Образ памяти для фиксированных двоичных исполняемых файлов.

    Класс Java в версии Jython.

    Компонент .NET в версии IronPython.
    Импортирование расширений, написанных на языке C, операция им
    порта в Jython и импортирование пакетов – это расширенные возмож
    ности импортирования компонентов, не являющихся простыми фай
    лами модулей. Впрочем, для импортера различия в типах загружае
    мых файлов совершенно незаметны как при импорте, так и при обра
    щении к атрибутам модуля. Инструкция import b загружает некоторый модуль b в соответствии с настройками пути поиска модулей, а b.attr извлекает элемент модуля, будь то переменная или функция, написан
    ная на языке C. Некоторые стандартные модули, которые мы будем использовать в этой книге, в действительности написаны на языке C,
    но благодаря прозрачности импортирования это не имеет никакого значения для клиентов.
    Если у вас в различных каталогах имеются файлы b.py и b.so, интер
    претатор всегда будет загружать тот, что будет найден в каталоге, ко
    торый располагается раньше (левее) в пути поиска модулей, так как поиск в списке sys.path выполняется слева направо. Но что произой
    дет, если оба файла, b.py и b.so, находятся в одном и том же каталоге?
    В этом случае интерпретатор будет следовать стандартному порядку выбора файлов, впрочем, нет никаких гарантий, что такой порядок бу
    дет оставаться неизменным с течением времени. Вообще вы должны избегать зависимости от порядка выбора файлов интерпретатором Py
    thon в одном и том же каталоге – давайте своим модулям различные имена или настраивайте путь поиска модулей, чтобы обеспечить более очевидный порядок выбора файлов.

    496
    Глава 18. Модули: общая картина
    Дополнительные возможности выбора модуля
    Обычно операция импорта работает именно так, как описывается в дан
    ном разделе, – она отыскивает и загружает файлы, находящиеся на ва
    шей машине. Однако вполне возможно переопределить большую часть того, что делает операция импорта, используя то, что называется про+
    граммными ловушками импорта
    . Эти ловушки могут использовать
    ся, чтобы придать операции импорта дополнительные полезные воз
    можности, такие как загрузка файлов из архивов, расшифровывание и т. д. Фактически сам интерпретатор Python использует эти ловуш
    ки, чтобы обеспечить возможность извлечения импортируемых ком
    понентов из ZIPархивов – заархивированные файлы автоматически извлекаются во время импорта, когда в пути поиска выбирается файл с расширением .zip. За дополнительной информацией обращайтесь к описанию встроенной функции __import__ в руководстве по стан
    дартной библиотеке Python – настраиваемому инструменту, которым в действительности пользуется инструкция import.
    Кроме того, Python поддерживает понятие файлов с оптимизированным байткодом (.pyo), которые создаются и запускаются интерпретатором из командной строки с флагом

    O
    , однако они выполняются лишь немно
    гим быстрее, чем обычные файлы .pyc (обычно на 5 процентов быстрее),
    поэтому они используются достаточно редко. Система Psyco (глава 2)
    обеспечивает куда более существенный прирост в скорости выполнения.
    2. Компиляция (если необходимо)
    После того как в пути поиска модулей будет найден файл, соответствую
    щий имени в инструкции import, интерпретатор компилирует его в байт
    код, если это необходимо. (Мы рассматривали байткод в главе 2.)
    Интерпретатор проверяет время создания файла и пропускает этап компиляции исходного программного кода, если файл с байткодом
    .pyc
    не старше, чем соответствующий ему файл .py с исходным тек
    стом. Кроме того, если Python обнаружит в пути поиска только файл с байткодом и не найдет файл с исходным текстом, он просто загрузит байткод. Другими словами, этап компиляции пропускается, если можно ускорить запуск программы. Если вы измените исходный про
    граммный код, Python автоматически скомпилирует байткод при сле
    дующем запуске программы. Кроме того, вы можете распространять свою программу исключительно в виде файлов с байткодом, чтобы не передавать файлы с исходными текстами.
    Обратите внимание, что компиляция выполняется в момент импорти
    рования файла. По этой причине файл .pyc с байткодом для главного файла программы обычно не создается, если только он не был импор
    тирован еще куданибудь, – файлы .pyc создаются только при импор
    тировании файлов. Байткод главного файла программы создается в памяти компьютера, а байткод импортированных файлов сохраня
    ется в файлах для ускорения будущих операций импорта.

    Как работает импорт
    497
    Главные файлы программ часто планируется исполнять непосредст
    венно и никуда их не импортировать. Позднее мы увидим, что сущест
    вует возможность создать файл, который будет играть роль как глав
    ного файла программы, так и модуля, доступного для импорта. Такие файлы могут и исполняться, и импортироваться, поэтому для них соз
    даются соответствующие файлы .pyc. Чтобы разобраться с тем, как это получается, читайте обсуждение специальных атрибутов __name__
    и __main__ в главе 21.
    3. Запуск
    На последнем шаге операции импортирования производится запуск байткода модуля. Все инструкции в файле модуля выполняются по порядку, сверху вниз, и любые операции присваивания, которые встретятся на этом шаге, будут создавать атрибуты конечного объекта модуля. Таким образом, этот этап выполнения создает все инструмен
    ты, которые определяются модулем. Например, во время импортиро
    вания выполняются инструкции def в файле, которые создают функ
    ции и присваивают их атрибутам модуля. После этого функции могут вызываться из программы, выполнившей импорт.
    На этом последнем шаге операции импортирования фактически запус
    кается программный код модуля, поэтому, если программный код верхнего уровня в файле модуля выполняет какиенибудь действия,
    результаты этих действий можно будет наблюдать во время импорта.
    Например, при импорте файла можно будет наблюдать результат рабо
    ты инструкций print на верхнем уровне модуля. Инструкции def про
    сто определяют объекты для последующего использования.
    Как видите, во время импорта выполняется достаточно много работы –
    производится поиск файла, в случае необходимости запускается ком
    пилятор и производится запуск программного кода. Вследствие этого любой заданный модуль по умолчанию импортируется только один раз за все время работы программы. При повторных попытках импор
    тировать модуль все три шага просто пропускаются, и повторно ис
    пользуется модуль, уже загруженный в память.
    1
    Если вам потребуется еще раз импортировать файл, который уже был загружен (например,
    чтобы обеспечить поддержку настроек, выполняемых пользователем),
    воспользуйтесь функцией reload, с которой мы встретимся в следую
    щей главе.
    1
    В реальности интерпретатор хранит загруженные модули во встроенном словаре sys.modules, который проверяется в начале операции импортирова
    ния, чтобы определить, не был ли уже загружен указанный модуль. Если вам потребуется увидеть, какие модули были загружены, импортируйте модуль sys и выведите результат работы метода sys.modules.keys(). Подроб
    нее об этой внутренней таблице рассказывается в главе 21.

    498
    Глава 18. Модули: общая картина
    В заключение
    В этой главе были даны основные понятия, имеющие отношение к мо
    дулям, атрибутам и импорту, а также был исследован принцип дейст
    вия инструкции import. Мы узнали, что во время операции импортиро
    вания производится поиск файла модуля в пути поиска модулей, ком
    пиляция в байткод и выполнение всех инструкций, создающих его со
    держимое. Мы также узнали, как настроить путь поиска, в первую очередь с помощью переменной окружения PYTHONPATH, чтобы иметь возможность импортировать модули из других каталогов, отличных от домашнего каталога и от каталогов стандартной библиотеки.
    Как показала эта глава, операция импортирования и модули являют
    ся основой архитектуры программ на языке Python. Крупные про
    граммы делятся на множество файлов, которые связываются между собой во время выполнения посредством импортирования. Местонахо
    ждение файлов модулей во время импортирования определяется с по
    Стороннее программное обеспечение: distutils
    Настройка пути поиска модулей, описание которой приводится в этой главе, в первую очередь касается программного кода, ко
    торый вы пишете самостоятельно. Сторонние расширения для
    Python обычно используют для автоматической установки са
    мих себя такой инструмент, как distutils, входящий в состав стандартной библиотеки, поэтому для использования такого программного кода не требуется выполнять настройку пути по
    иска модулей.
    Системы, использующие distutils, обычно поставляются со сце
    нарием setup.py, который запускается для установки таких сис
    тем – этот сценарий импортирует и использует модуль distutils,
    чтобы поместить систему в каталог, который уже является ча
    стью пути поиска модулей (обычно в подкаталог Lib\sitepackages
    в каталоге, куда был установлен Python).
    За дополнительной информацией о распространении и установ
    ке с помощью distutils обращайтесь к стандартному набору ру
    ководств по языку Python, потому что эта тема далеко выходит за рамки данной книги (например, этот инструмент дополни
    тельно обеспечивает возможность компиляции расширений на языке C на машине, где производится установка). Кроме того,
    обратите внимание на развивающуюся систему eggs, распростра
    няемую с открытыми исходными текстами, которая добавляет возможность проверки зависимостей для установленного про
    граммного кода на языке Python.

    Закрепление пройденного
    499
    мощью пути поиска модулей, а модули определяют атрибуты, исполь
    зующиеся за пределами этих модулей.
    Конечно, основное назначение операции импорта и модулей состоит в том, чтобы образовать структуру программы, логика которой под
    разделяется на самостоятельные программные компоненты. Про
    граммный код в одном модуле изолирован от программного кода в дру
    гом – фактически ни один модуль не может получить доступ к именам,
    определенным в другом модуле, если явно не выполнит инструкцию import
    . Благодаря этому модули дают возможность минимизировать конфликты имен между различными частями программы.
    В следующей главе вы увидите, что все это означает в терминах факти
    ческого программного кода. Но прежде чем двинуться дальше, поста
    райтесь ответить на контрольные вопросы к главе.
    Закрепление пройденного
    Контрольные вопросы
    1. Каким образом файл с исходным программным кодом модуля пре
    вращается в объект модуля?
    2. Зачем может потребоваться настраивать значение переменной ок
    ружения PYTHONPATH?
    3. Назовите четыре основных компонента, составляющих путь поиска модулей.
    4. Назовите четыре типа файлов, которые могут загружаться опера
    цией импортирования.
    5. Что такое пространство имен, и что содержит пространство имен модуля?
    Ответы
    1. Файл с исходными текстами модуля автоматически превращается в объект модуля в результате выполнения операции импортирова
    ния. С технической точки зрения исходный программный код моду
    ля выполняется во время импортирования, инструкция за инструк
    цией, и все имена, которым по мере выполнения операций будут присвоены значения, превращаются в атрибуты объекта модуля.
    2. Настройка переменной PYTHONPATH может потребоваться только в слу
    чае необходимости импортировать модули, размещенные в катало
    гах, отличных от того, в котором вы работаете (то есть отличных от текущего каталога при работе в интерактивной оболочке или от ка
    талога, где находится главный файл программы).
    3. Четырьмя основными компонентами, составляющими путь поиска модулей, являются: домашний каталог главного файла программы
    (каталог, в котором он находится), все каталоги, перечисленные

    500
    Глава 18. Модули: общая картина в переменной окружения PYTHONPATH, каталоги стандартной библио
    теки и все каталоги в файлах с расширением .pth, размещенных в стандартных местах. Из них доступны для настройки переменная окружения PYTHONPATH и файлы с расширением .pth.
    4. Интерпретатор Python может загружать файлы с исходными тек
    стами (.py), файлы с байткодом (.pyc), файлы расширений, написан
    ных на языке C (например, файлы с расширением .so в Linux или с расширением .dll в Windows), или каталог с указанным именем,
    в случае импортирования пакета. Операция импортирования может также загружать менее обычные файлы, такие как компоненты из архивов в формате ZIP, классы Java в Jython – версии Python, ком
    поненты .NET в IronPython и статически скомпонованные расшире
    ния, написанные на языке C, которые вообще не представлены в ви
    де файлов. С помощью программных ловушек, которые имеет реа
    лизация операции импорта, можно загрузить все, что угодно.
    5. Пространство имен – это независимый пакет переменных, извест
    ных как атрибуты пространства имен объекта. Пространство имен модуля содержит все имена, присваивание значений которым про
    изводится программным кодом на верхнем уровне модуля (то есть не вложенным в инструкции def или class). С технической точки зре
    ния глобальная область видимости трансформируется в пространст
    во имен атрибутов объекта модуля. Пространство имен модуля мо
    жет изменяться с помощью операций присваивания из других фай
    лов, которые импортируют данный модуль, хотя это и не приветст
    вуется (подробнее об этом рассказывается в главе 16).

    19
    Основы программирования модулей
    Теперь, когда мы рассмотрели общие идеи, лежащие в основе модулей,
    обратимся к простому примеру модулей в действии. Модули в языке
    Python создаются очень просто – это всего лишь файлы с программ
    ным кодом на языке Python, которые создаются с помощью текстового редактора. Вам не требуется употреблять специальные инструкции,
    чтобы сообщить интерпретатору Python, что вы создаете модуль, –
    практически любой текстовый файл может играть эту роль. Интерпре
    татор сам заботится о поиске и загрузке модулей, поэтому их очень просто использовать – клиент просто импортирует модуль или опре
    деленные имена из модуля и использует объекты, на которые эти име
    на ссылаются.
    Создание модуля
    Чтобы определить модуль, достаточно воспользоваться текстовым ре
    дактором, с его помощью ввести некоторый программный код на язы
    ке Python в текстовый файл и сохранить его с расширением «.py» –
    любой такой файл автоматически будет считаться модулем Python.
    Все имена, которым будет выполнено присваивание на верхнем уровне модуля, станут его атрибутами (именами, ассоциированными с объек
    том модуля) и будут доступны для использования клиентами.
    Например, если ввести следующую инструкцию def в файл с именем
    module1.py
    и импортировать его, тем самым будет создан объект моду
    ля с единственным атрибутом – именем printer, которое ссылается на объект функции:
    def printer(x): # Атрибут модуля
    print x
    Прежде чем мы двинемся дальше, следует сказать несколько слов об именах файлов модулей. Вы можете называть ваши модули, как вам

    502
    Глава 19. Основы программирования модулей будет угодно, при условии, что эти имена будут оканчиваться расши
    рением .py, если вы собираетесь импортировать их. Для главных фай
    лов программ, которые будут запускаться, но не будут импортировать
    ся, имена не обязательно должны иметь расширение .py, однако было бы желательно использовать это расширение в любом случае, потому что оно делает назначение файлов более очевидным и позволит в буду
    щем импортировать любой из ваших файлов.
    Поскольку имена модулей внутри программы превращаются в имена пе
    ременных (без расширения .py), они также должны следовать правилам именования обычных переменных, которые приводились в главе 11.
    Например, можно создать файл модуля с именем if.py, но его невозмож
    но будет импортировать, потому что if – это зарезервированное слово,
    и когда вы попытаетесь выполнить инструкцию import if, интерпрета
    тор выдаст сообщение о синтаксической ошибке. Фактически и имена модулей, и имена каталогов, используемых при импортировании паке
    тов (рассматривается в следующей главе), должны соответствовать тре
    бованиям, предъявляемым к именам переменных и представленным в главе 11, – они могут, например, содержать только алфавитные сим
    волы, цифры и символы подчеркивания. Имена каталогов с пакетами также не могут содержать посторонних символов, таких как пробелы,
    даже если они являются допустимыми для используемой платформы.
    Когда производится импорт модуля, интерпретатор Python преобразу
    ет имя модуля в имя внешнего файла, добавляя в начало путь к ката
    логу из пути поиска модулей и добавляя .py или другое расширение в конец. Например, в конечном итоге имя модуля M преобразуется в имя некоторого внешнего файла <каталог>\M.<расширение>, который содер
    жит программный код модуля.
    Как упоминалось в предыдущей главе, существует возможность соз
    дать модуль для Python на другом языке программирования, таком как C или C++ (или Java в реализации Jython). Такие модули называ
    ются модулями расширений и обычно используются для создания биб
    лиотек, используемых сценариями на языке Python. Когда модули расширений импортируются программным кодом на языке Python,
    они выглядят и ведут себя точно так же, как обычные модули, напи
    санные на языке Python, – они импортируются инструкцией import и предоставляют функции и объекты в виде атрибутов объекта моду
    ля. Обсуждение модулей расширений выходит далеко за рамки этой книги, поэтому за дополнительной информацией обращайтесь к стан
    дартным руководствам по языку Python или к специализированным книгам, таким как «Programming Python».
    1   ...   56   57   58   59   60   61   62   63   ...   98


    написать администратору сайта