ПРИМЕЧАНИЕ Если вы собираетесь опубликовать свою библиотеку, желательно определить ее версию. В PEP 396 указаны некоторые практические приемы объявления строк версий. К числу других распространенных переменных метаданных относятся имя автора, лицензия, дата и контактная информация. При определении в программном коде они могли бы выглядеть так: __author__ = 'Matt Harrison' __date__ = 'Jan 1, 2017'
26.11. Тестирование 259__contact__ = 'matt_harrison someplace.com' __version__ = '0.1.1' 26.8. Операции с журналом Еще одна переменная, часто объявляемая на глобальном уровне, — средство ведения журнала для модуля. Стандартная библиотека Python включает библиотеку ведения журнала, которая позволяет регистрировать инфор- мацию на разных уровнях детализации в четко определенных форматах. Скорее всего, необходимость в записи информации в журнал возникнет у разных классов или функций. Обычно программа выполняет иници- ализацию средства ведения журнала один раз на глобальном уровне, а затем использует полученный дескриптор в модуле. 26.9. Другие глобальные переменные Не используйте глобальные переменные там, где хватает локальных пере- менных. Основные глобальные переменные в коде Python — метаданные, константы и подсистема ведения журнала. Глобальные переменные нередко встречаются в коде примеров. Не под- давайтесь искушению копировать такой код. Выделите его в функцию или класс. Это принесет пользу в будущем, когда вы займетесь рефак- торингом или отладкой вашего кода. 26.10. Реализация После глобальных переменных и настройки ведения журнала следует непосредственное содержание кода — реализация. Существенную часть кода займут функции и классы. Основная логика модуля содержится в классе Catter 26.11. Тестирование Обычно правильно организованный тестовый код отделяется от кода реализации. Python допускает небольшое исключение из этого правила.
260 Глава 26. Полноценный пример Строки документации Python могут определяться на уровне модулей, функций, классов и методов. В строках документации можно разместить фрагменты REPL, демонстрирующие использование данной функции, класса или модуля. Такие фрагменты, если они будут хорошо продуманы и построены, эффективно документируют стандартные варианты при- менения модуля. Другая интересная возможность doctest — проверка документации. Если ваши фрагменты когда-то работали, а теперь не работают, значит, либо изменился ваш код, либо сами фрагменты содержат ошибки. Это можно легко выявить до того, как пользователи начнут жаловаться вам. СОВЕТКод doctest может размещаться в отдельном текстовом файле. Чтобы вы- полнить произвольный файл средствами doctest , используйте функцию testfile : import doctest doctest.testfile('module_docs.txt') ПРИМЕЧАНИЕКроме doctest стандартная библиотека Python включает модуль unittest , реализующий типичную методологию xUnit — подготовка/проверка/за- вершение. У обоих стилей тестирования — doctest и unittest — есть как достоинства, так и недостатки. Стиль doctest обычно создает больше труд- ностей с отладкой, а стиль unittest содержит шаблонный код, который считается слишком «завязанным на Java». Вы можете сочетать оба стиля, чтобы получить хорошо документированный и хорошо протестированный код. 26.12. if __name__ == '__main__':Если ваш файл должен выполняться в качестве сценария, в конце сце- нария вы найдете следующий фрагмент: if __name__ == '__main__': sys.exit(main(sys.argv[1:]) or 0) 26.13. __name__ 261 Чтобы понять эту команду, необходимо понимать смысл переменной __name__ 26.13. __name__ Python определяет переменную уровня модуля __name__ для любого импортируемого модуля или любого выполняемого файла. Обычно значением __name__ является имя модуля: >>> import sys >>> sys.__name__ 'sys' >>> import xml.sax >>> xml.sax.__name__ 'xml.sax' У этого правила есть исключение. При выполнении модуля (то есть python3 some_module.py ) значением __name__ является строка "__main__" По сути, значение __name__ сообщает, загружается ли файл как библио- тека или же выполняется как сценарий. ПРИМЕЧАНИЕ Использование __name__ можно продемонстрировать на простом примере. Создайте файл some_module.py со следующим кодом: print("The __name__ is: {0}".format(__name__)) Теперь запустите REPL и импортируйте этот модуль: >>> import some_module The __name__ is: some_module А теперь выполните этот модуль: $ python3 some_module.py The __name__ is: __main__ Одна из распространенных идиом в мире Python — размещение подоб- ных проверок в конце модуля, который также может служить сценарием. Такая проверка определяет, выполняется файл или импортируется:
262 Глава 26. Полноценный пример if __name__ == '__main__': # выполнение sys.exit(main(sys.argv[1:]) or 0) Эта простая команда запускает функцию main , когда файл выполняется. И наоборот, если файл используется в качестве модуля, функция main автоматически выполняться не будет. Функция sys.exit вызывается с возвращаемым значением main (или 0, если main не возвращает значе- ние), как делают все добропорядочные программы в мире UNIX. Функция main получает параметры командной строки в списке sys.argv В самом начале sys.argv находится элемент python3 , поэтому нам при- ходится создать срез sys.argv , чтобы исключить этот элемент перед тем, как передавать параметры main СОВЕТНекоторые разработчики размещают логику выполнения (код, расположен- ный внутри функции main ) прямо под проверкой if __name__ == '__main__' :. Несколько причин для хранения логики в функции: • Функция main может вызываться из других мест. • Функцию main можно легко тестировать с разными аргументами. • Сокращение объема кода, выполняемого на глобальном уровне. 26.14. ИтогиВ этой главе был проанализирован код Python в сценариях командного интерпретатора. Мы рассмотрели некоторые полезные практические приемы и стандартные соглашения программирования. Если вы будете структурировать свой код так, как описано в этой главе, то будете следовать лучшим практикам программирования на языке Python. Описанная структура также упростит чтение вашего кода дру- гими разработчиками. 26.15. Упражнения 263 26.15. Упражнения 1. Скопируйте код cat.py . Добейтесь того, чтобы он заработал на вашем компьютере. Не думайте, что это напрасный труд — занимаясь про- граммированием, вы очень часто не создаете что-то с нуля, а повтор- но используете код, написанный другими людьми. 2. Напишите сценарий convert.py , который преобразует файл из одной кодировки в другую. Программа должна получать следующие па- раметры командной строки: • Имя входного файла. • Входная кодировка (по умолчанию UTF-8). • Выходная кодировка. • Режим обработки ошибок (игнорировать/выдать исключение).
27В начале путиК этому моменту вы уже достаточно хорошо понимаете, как работают программы Python, уверенно владеете REPL и умеете анализировать классы с использованием функций dir и help Что дальше? Это зависит от вас. В принципе, у вас есть все предпосылки для использования Python для сайтов, GUI-программ или вычислитель- ных приложений. Среди огромных преимуществ Python можно выделить различные со- общества, связанные с разными областями программирования. Суще- ствует множество локальных пользовательских групп, конференций, списков рассылки и социальных сетей, посвященных разным аспектам Python. Многие из этих групп охотно принимают новых программистов и делятся своими знаниями. Не бойтесь опробовать что-нибудь новое; в Python это делается просто, и, скорее всего, найдутся и другие разра- ботчики с похожими интересами. Приложение АПеремещение по файламЕсли вы еще не знакомы с навигацией в файловой системе с терминала, ниже приведено краткое введение. Сначала необходимо открыть тер- минал — одно из тех окон с большим объемом текста, которые обычно показывают в фильмах про хакеров. Вообще говоря, программировать можно и без них, но умение переходить между каталогами и выполнять команды из терминала — навык безусловно полезный. А.1. Mac и UNIXНа компьютерах Mac вызовите Spotlight комбинацией клавиш Command+Space и введите terminal , чтобы запустить терминальное при- ложение для Mac. В системах семейства Linux способ запуска терминала зависит от кон- фигурации рабочей среды. Например, в системах Ubuntu можно вос- пользоваться комбинацией клавиш Ctr+Alt+T . Простейший терминал, присутствующий в большинстве систем, называется xterm Вы должны знать несколько основных команд: cd — переход в другой каталог. Например, команда $ cd /Documents выполняет переход в каталог Documents , находящийся в домашнем ка- талоге ( — сокращенное обозначение домашнего каталога, которым является каталог /Users/<имя_пользователя> на Mac или /home/<имя_поль- зователя> в Linux); pwd — вывод текущего каталога, в котором вы находитесь; ls — вывод содержимого текущего каталога. 266 Приложение А Если у вас имеется сценарий Python, хранящийся в файле /work/intro-to- py/hello.py , его можно выполнить следующей последовательностью команд: $ cd /work/intro-to-py $ python3 hello.py A.2. Windows В системе Windows нажмите Win+R , чтобы открыть интерфейс запуска программ. Введите cmd , чтобы открыть окно командной строки. Основные команды: cd — переход в другой каталог. Например, команда c:> cd C:\Users выполняет переход в каталог C:\Users; echo %CD% — вывод текущего каталога, в котором вы находитесь; Dir — вывод содержимого текущего каталога. Если у вас имеется сценарий Python, хранящийся в файле C:\Users\matt\ intro-to-py\hello.py , его можно выполнить следующей последовательностью команд: C:> cd C:\Users\matt\intro-to-py C:\Users\matt\intro-to-py> python hello.py
Приложение Б Полезные ссылки Полезные ссылки на тему Python: https://python.org/ — домашняя страница Python https://github.com/mattharrison/Tiny-Python-3.6-Notebook — справочник по Python 3.6. http://docutils.sourceforge.net/ — reStructuredText — упрощенный язык раз- метки для документации Python. https://pyformat.info — удобный справочник по форматированию строк. https://pypi.python.org/pypi — Python Package Index — сторонние пакеты. https://www.python.org/dev/peps/pep-0008/ — PEP 8 — стандарт оформления кода. https://www.anaconda.com/download/ — Anaconda — альтернативная программа установки Python с множеством сторонних пакетов. https://www.djangoproject.com/ — Django — популярный веб-фреймворк. http://scikit-learn.org/ — машинное обучение на Python. https://www.tensorflow.org/ — глубокое обучение на Python. https://www.reddit.com/r/Python/ — новости Python.
Об автореМэтт Харрисон использует Python с 2000 года. Он руководит компанией MetaSnake, занима- ющейся консультационными услугами и про- ведением корпоративного обучения в области Python и теории анализа данных. В прошлом он работал в областях научных исследований, управления сборкой и тестированием, бизнес- аналитики и хранения данных. Он выступал с презентациями и учебными лекциями на таких конферен- циях, как Strata, SciPy, SCALE, PyCON и OSCON, а также на локальных пользовательских конференциях. Структура и материал этой книги основаны на его практическом опыте преподавания Python. Мэтт пери- одически публикует в «Твиттере» полезную информацию, относящуюся к Python ( @__mharrison__ ). Научные редакторы Роджер Э. Дэвидсон (Roger A. Davidson) в настоящее время является де- каном факультета математики в колледже Америкэн Ривер (Сакраменто, штат Калифорния). Его докторская диссертация была написана на тему авиационно-космической техники, но он также является обладателем дипломов об образовании в области computer science, электротехники и системотехники, а также недавно получил сертификат в области data science (с чего и началось его увлечение Python). На протяжении своей карьеры Роджер работал в NASA, в компаниях из списка Fortune 50, в стартапах и муниципальных колледжах. Он с энтузиазмом относится к образованию, науке (не только к обработке данных), пирогам с ежеви- кой и руководству неоднородными коллективами при решении больших задач. Эндрю Маклафлин (AndrewMcLaughlin) — программист и проек- тировщик, системный администратор в первую половину дня и се- мьянин во вторую. Из-за своего внимания к деталям занимается веб- программированием с 1998 года. Обладатель диплома с отличием университета Джорджа Фокса, Эндрю получил степень в области систем управления и информации. В свободное время он ходит в турпоходы со своей женой и двумя детьми, а также иногда работает в столярной мастер- ской (все пальцы пока на месте). Читайте его публикации в «Твиттере»: @amclaughlin
Мэтт Харрисон Как устроен Python. Гид для разработчиков, программистов и интересующихся Перевел с английского Е. Матвеев Заведующая редакцией Ю. Сергиенко Ведущий редактор К. Тульцева Литературный редактор О. Букатка Художественный редактор С. Заматевская Корректоры С. Беляева, И. Тимофеева Верстка Л. Егорова Изготовлено в России. Изготовитель: ООО «Прогресс книга». Место нахождения и фактический адрес: 194044, Россия, г. Санкт-Петербург, Б. Сампсониевский пр., д. 29А, пом. 52. Тел.: +78127037373. Дата изготовления: 10.2018. Наименование: книжная продукция. Срок годности: не ограничен. Импортер в Беларусь: ООО «ПИТЕР М», 220020, РБ, г. Минск, ул. Тимирязева, д. 121/3, к. 214, тел./факс: 208 80 01. Налоговая льгота — общероссийский классификатор продукции ОК 034-2014, 58.11.12 — Книги печатные профессиональные, технические и научные. Подписано в печать 09.10.18. Формат 70×100/16. Бумага офсетная. Усл. п. л. 21,930. Тираж 1200. Заказ 0000. Отпечатано в ОАО «Первая Образцовая типография». Филиал «Чеховский Печатный Двор». 142300, Московская область, г. Чехов, ул. Полиграфистов, 1. Сайт: www.chpk.ru. E-mail: marketing@chpk.ru Факс: 8(496) 726-54-10, телефон: (495) 988-63-87
|