добавление к сценариям командной строки, 825
дополнительная информация, 974 запуск программ, 626 и потоки выполнения, 298, 750, 816, 839
к инструментам командной строки, 785
независимые окна, 624 приемы программирования, 810 прикрепление к фреймам, 619 графический интерфейс пользователя (GUI, ГИП), 87, 479, 483 добавление кнопок, 511 добавление нескольких виджетов, 530
добавление обработчиков, 511 добавление собственных обработчиков, 514
дополнительные инструменты, 100 запуск программ, 481, 501 менеджеры компоновки, 500 настройка виджетов с помощью классов, 537 ООП, 89
повторно используемые компоненты GUI, 540
получение ввода от пользователя, 92 приемы программирования, 497 программа^^ World, 497, 508 пути усовершенствования, 98 создание виджетов, 499 групповые символы, 245
Д
двоичные файлы
struct, модуль, анализ с помощью, 228
и Юникод, 703 определение, 208, 220 произвольный доступ, 230 деревья каталогов
глобальная замена, 456 копирование, 417 обход, 249
подсчет строк исходного программного кода, 458 поиск, 435
различий, 425 редактирование файлов, 454 сканирование, 249, 378 сравнение, 422
текстовый редактор PyEdit, 875 удаление файлов с байт-кодом, 442 дескрипторы файлов
обертывание объектами файлов, 236, 321
диалоги, 566
PyEdit, текстовый редактор, 865, 872, 874
Quit, кнопка, 569 выбор шрифта, 872 вывод результатов, 576 динамический выбор цвета, 578 пользовательские, 581 разновидности, 566 стандартные, 567 динамический выбор цвета, 578 добавление виджетов без их сохранения, 508
дочерний процесс, 261 порождение, 266
З
завершение программ, 306 os, модуль, 307 sys, модуль, 306
с дочерними потоками выполнения, 295
закрытие файлов, 211 записи
pickle, модуль, сохранение записи с помощью, 61, 64 shelve, модуль, сохранение записи с помощью, 66 в текстовых файлах, 55 представление, 43 запись в файлы, 211 запросы, поддержка CGI-сценариями, 109
запуск программ
и потоки выполнения, 271 с графическим интерфейсом, 501
И
изображения, 633
в панелях инструментов, 672 миниатюры, 647, 718 имена полей (списки), 46 именованные каналы, 331 области применения, 334 определение, 319 основы использования, 332 индексы, 687
инструменты ветвления процессов, 260 инструменты для работы с каталогами обзор, 243
обработка имен файлов в Юникоде, 254
обход деревьев каталогов, 249 обход одного каталога, 243 инструменты для работы с файлами в модуле os, 233
встроенные объекты файлов, 209 вывод в файлы, 210 двоичные файлы, 208, 220 модель объекта файла, 207 обзор, 206
сканеры файлов, 239 текстовые файлы, 207, 220 фильтры файлов, 241 инструменты командной строки, 785 инструменты обработки чисел, 955 инструменты реализации игровых программ, 763
интерфейс командной строки к хранилищу shelve, 83 интерфейс передачи сообщений (Message Passing Interface, MPI), 260 источники документации по модулям, 134
итераторы, 164
объектов файлов, 242 файлов, 216
К
каналы
multiprocessing, пакет, 351 анонимные, 317-319 именованные, 317, 331
и сокеты, 842 реализация каналов, 318 реализация графического интерфейса в виде отдельной программы, 835 каталоги
веб-интерфейсы, 115 обход, 243, 448
отображение всех изображений в каталоге, 645
отчет о различиях, 433 поиск расхождений, 422 сканирование, 377 классы, 814 GUI
повторно используемые компоненты, 540
расширение классов компонентов, 544
альтернативные, 77 другие разновидности баз данных, 81 контейнеры, 546 наследование, 74 настройка виджетов с помощью классов, 537 программирование, 71 реализация возможности сохранения, 79
реализация поведения, 73 кнопки Quit, 569
выбор случайной картинками, 637 добавление, 511 отложенные вызовы, 516 фиксированного размера, 654 коды завершения, 308
и ветвление процессов, 312 и потоки выполнения, 314 команд оболочки, 308 команды оболочки find, 436
subprocess, модуль, выполнение с помощью, 159 выполнение, 157 обмен данными, 158 ограничения, 161 определение, 156 конструкторы, специализация, 77 контейнерные классы, 546 копирование деревьев каталогов, 417
М
медиафайлы, проигрывание, 464 менеджеры компоновки, 500 grid, 726, 729
expand и fill, параметры, 534 pack, 729
изменение размеров виджетов, 504 определение, 500 порядок компоновки, 533 размещение, 505 менеджеры контекста
и закрытие файлов, 212 и потоки выполнения, 285 и фильтры файлов, 242 меню
PyEdit, в редакторе, 864 Menubutton, виджет, 665 автоматизация создания, 675, 773 на основе фреймов, 665 окон верхнего уровня, 660 определение, 660 отображение в окнах, 670 метки
bg, параметр, 555 expand, параметр, 556 fg, параметр, 555 fill, параметр, 556 font, атрибут, 556 height, атрибут, 556 width, атрибут, 556 настройка, 555 миниатюры изображений
и холсты с прокруткой,718 создание, 647
модули, источники документации, 134
Н
наследование
SimpleEditor, класс, 694 и классы, 74 независимые окна, 624 независимые программы, 337 запуск, 357
О
обертывание дескрипторов объектами файлов, 236, 321
обработчики исключений и закрытие файлов, 212
обработчики обратного вызова, 496
обработчики событий
lambda-выражения, 515 аргументы и глобальные переменные, 518 добавление, 511
динамическая перезагрузка, 803 добавление собственных обработчиков, 514
дополнительные протоколы, 528 объекты вызываемых классов, 527 отложенные вызовы, 516 передача данных, 576 помещение в очередь, 817 привязка событий, 588 связанные методы, 525 связывание событий, 529 обрезание виджетов, 531 объекты вызываемых классов как обработчики событий, 527 объекты файлов, 321 объемлющая области видимости, 519 окна
PyEdit, текстовый редактор, 867 автоматизация создания, 805 вывод по требованию, 826 независимые, 624 консоли DOS
как избежать появления, 502 скрытие и перерисовка, 754 с меню и панелью инструментов, 670 ООП (объектно-ориентированное программирование), 69 другие разновидности баз данных, 81 классы, 71 наследование, 74
при разработке графических интерфейсов, 89
реализация возможности сохранения, 79
реализация поведения, 73 реструктуризация программного кода, 75
открытие файлов, 210, 218 открытое программное обеспечение, 860 отчет о различиях между деревьями каталогов, 433 очереди
помещение данных, 813 помещение обработчиков событий, 817
П
панели инструментов
PyEdit, в текстовом редакторе, 864 PyDemos, 846, 860 PyGadgets, 852, 860 автоматизация создания, 773 изображения, 672 отображение в окнах, 670 параллельная обработка
multiprocessing, пакет, 343 ветвление процессов, 260 другие системные инструменты, 374 запуск программ, 362 и взаимодействия между процессами, 316
и завершение программ, 306 определение, 259 переносимый модуль запуска программ, 368
потоки выполнения, 270 переменные
Checkbutton, класс виджетов, 605 ассоциированные, 599, 602 глобальные, 295, 352 и переключатели, 609 и ползунки, 617
рекомендации по использованию, 612
переменные оболочки доступ, 167 изменение, 177 определение, 175 получение значений, 176 подсчет строк исходного программного кода, 458 поиск
в деревьях каталогов, 435 различий между деревьями каталогов, 425
полиморфизм, 192 полнофункциональные интернетприложения, 488
полосы прокрутки, компоновка, 681 порожденные программы, 178 порядок следования байтов, 228 потоки ввода-вывода io.BytesIO, класс, 196 io.StringIO, класс, 196 буферизация потока вывода, 310 и взаимодействие с пользователем, 187 потоки ввода-вывода
перенаправление в виджеты, 797 перенаправление в объекты Python, 192
перенаправление в файлы/програм-мы, 181
перенаправление в функции print, 197
перенаправление с помощью функции os.popen, 198, 199 перенаправление с помощью функции модуля subprocess, 198, 200 перехват потока stderr, 197 стандартные потоки, 167, 180 потоки выполнения, 270
PyEdit, текстовый редактор, 876 queue, модуль, 293 _thread, модуль, 274 threading, модуль, 287 завершение, 816 и анимация, 762 и анонимные каналы, 323 и глобальная блокировка интерпретатора, 302
и графические интерфейсы, 298, 750, 839
порождение, 259 преимущества, 270 преобразование строк, 140 привязка
событий, 585, 724 тегов, 707
программирование на Python
«Hello World», программа, 497 веб-интерфейс, 102 графический интерфейс, 86 другие разновидности баз данных, 81 интерфейс командной строки, 83 классы, 71 наследование, 74
обеспечивающее повторное использование, 630
объектно-ориентированное программирование, 69
получение ввода от пользователя, 92 реализация возможности сохранения, 79
реализация поведения, 73 реструктуризация программного кода, 75
сохранение записей на длительное время, 54
программы
независимые, 337, 357 перенаправление стандартных потоков ввода-вывода, 181 производительность
и потоки выполнения, 270 сохранение миниатюр в файлах, 652 произвольный доступ к данным в фай-лах,230
пути к каталогам и символы обратного слеша, 148
Р
разделяемая память, 318 mmap, модуль, 318 multiprocessing, пакет, 352 разрезание файлов, 391, 399 расширение методов, 76 редактирование файлов в деревьях каталогов, 454
резервные копии, проверка, 431 реструктуризация программного кода альтернативные классы, 77 расширение методов, 76 специализация конструкторов, 77 формат отображения, 76 родительский процесс, 261
С
связанные методы, 814 определение, 90
связанные методы как обработчики событий, 525
связывание событий, 529 сигналы, 340
символы конца строки, 138 в текстовых файлах, 224 синхронизация
_thread, модуль, 280 threading, модуль, 290 и потоки выполнения, 272 система координат, холсты, 711 системные инструменты, 258 os, модуль, 150 sys, модуль, 146
разработка системных сценариев,
133
системные программы
автоматизированный запуск программ, 473
вывод имен файлов с символами Юникода, 387 другие примеры, 462
копирование деревьев каталогов, 417 с помощью классов, 460 обход каталогов, 448 подсчет строк исходного программного кода, 458 поиск
в деревьях каталогов, 435 различий между деревьями каталогов, 425
проигрывание медиафайлов, 464 разрезание и объединение файлов, 390
сканирование
всего компьютера, 382 деревьев каталогов, 378 каталогов, 377 пути поиска модулей, 379 создание веб-страниц для переадресации, 403
сравнение деревьев каталогов, 422 сценарии регрессивного тестирования, 408
системные сценарии, разработка bytes, тип объектов, 141 дополнительные справочники, 145 источники документации по моду-лям,134 обзор, 132
операции с файлами, 142 постраничный вывод строк документации, 135
руководства по библиотекам Python, 144
способы использования программ, 143
строковые методы, 138
сценарий постраничного вывода, 137
Юникод, 141
системных приложений область, 129 сканеры файлов, 239 сканирование
всего компьютера, 382 дерева каталогов, 378 каталогов, 377 пути поиска модулей, 379 скомпилированные двоичные файлы, 99 словарей итераторы, 53 словари
вложенные структуры, 51 примеры реализации записей, 48 словарей, 52 списки словарей, 50 способы создания, 49
события
от мыши, 588 привязка, 585, 724 связывание, 529 совместно используемая память и потоки выполнения, 270 соглашения об именовании файлов, 56 соединение файлов, 395, 399 создание веб-страниц для переадресации, 403 сокеты, 335
и каналы, 842
и независимые программы, 337 области применения, 339 основы, 335
реализация графического интерфейса в виде отдельной программы, 830
сохранения возможность, реализация, 79
списки
append, метод, 45, 52 вложенные структуры, 52 имена полей, 46
примеры реализации записей, 43 словарей, 50
сравнение деревьев каталогов, 422 ссылки на объекты
и обработчики событий, 803 стандартные диалоги, 567 стандартные потоки ввода-вывода доступ, 167 определение, 180
перенаправление в файлы/програм-мы, 181 строки
Text, виджет, 686 запроса, 109
определение позиции, 686 преобразование, 140 текст Юникода, 697 форматирование, 115 строковые методы join, метод, 155 основы, 138 сценарии
queue, пример использования модуля, 297
start, использование команды, 367 Unix, особенности на платформе, 174 вспомогательные сценарии, 60 выполнение команд оболочки из сценариев, 156
записи/чтения данных, 57 и аргументы командной строки, 171 и переменные оболочки, 175 и стандартные потоки ввода-вывода, 180
и текущий рабочий каталог, 168 первые замечания, 57 регрессивного тестирования, 408 сценарий постраничного вывода, 137 пример, 137 тестовые данные, 55
Т
таймеры, 300
теги
объектов, 714 привязка, 707 текст, 688
текстовые файлы, 207
вспомогательные сценарии, 60 и Юникод, 207, 695 преобразование символов конца строки, 224
сценарий записи/чтения данных, 57 тестовый сценарий создания данных, 55
текущий рабочий каталог, 168 доступ, 167
и командные строки, 170 и путь поиска модулей, 168
точки на окружности, 951
Ф
файлов объекты
close, метод, 209, 211 readlines, метод, 215 readline, метод, 215, 216 read, метод, 215 seek, метод, 230 writelines, метод, 211 write, метод, 211 встроенные, 209 вывод в файлы, 210 гарантированное закрытие, 212 другие режимы открытия файлов, 218
запись, 211
методы чтения-записи, 209 модель объекта файла, 207 обертывание дескрипторов, 236 определение, 207 открытие, 210, 218 чтение из файлов, 214
файлы, 55
закрытие, 212
и текущий рабочий каталог, 168 открытие, 218
перенаправление стандартных потоков ввода-вывода, 181 разработка системных сценариев, 142
разрезание, 391, 399 редактирование файлов в деревьях каталогов, 454 с байт-кодом, удаление, 442 соглашения об именовании, 56 соединение, 395, 399 текст Юникода, 700 чтение, 214
фильтры и сканирование файлов, 241 формы ввода, 595, 727 компоновка, 595 основы работы с сеткой, 728 функции и потоки выполнения, 271 функции-генераторы, 249
Х
холсты
базовые операции, 710 вытягивание фигур, 723 идентификаторы объектов, 713 и миниатюры изображений, 718 определение, 709 очистка, 723
перемещение объектов, 724 программирование, 711 прокрутка, 715 система координат, 711 события, 722 создание объектов, 712 теги объектов, 714
Ц
циклы
time.sleep, функция, 756, 757, 760 и потоки выполнения, 285
Ю
Юникод, 141, 221
PyEdit, поддержка в текстовом редакторе, 877, 878, 880 Text, виджет, 695 вывод имен файлов, 387 и текстовые файлы, 207 обработка имен файлов, 254, 256
1
Марк Лутц «Изучаем Python», 4 издание, СПб.: Символ-Плюс, 2010.
2
Я являюсь автором всех трех книг, упомянутых в этом разделе, и это дает мне возможность контролировать их содержимое и избегать повторений. Это также означает, что как автор я стараюсь не комментировать многие другие книги о Python, которые могут оказаться для вас весьма полезными и в которых могут обсуждаться темы, не рассматривающиеся ни в одной из моих книг. Упоминания об этих книгах вы найдете в Интернете или в других источниках информации о Python. Все три мои книги отражают опыт 13 лет преподавания Python и путь, пройденный от момента выхода первого издания книги «Programming Python» в 1995 году. (Здесь вполне уместно поместить фотографию убеленного сединами путешественника-иссле-дователя.)
3
Я вполне серьезно. На курсах по изучению Python, которые я веду уже довольно давно, я постоянно использовал имя «Bob Smith» (Боб Смит), возраст 40,5 лет и должности «developer» (разработчик) и «manager» (руководитель) для создания фиктивной записи в базе данных, пока на курсах в Чикаго я не встретил студента с именем Боб Смит (Bob Smith), которому было 40,5 лет, и который занимал должности разработчика и руководителя. В жизни иногда случаются курьезы.
4
Они могут проникать и в ваше подсознание. Новички Python иногда описывают такое явление, как «сны на Python» (попробуйте дать упрощенную интерпретацию по Фрейду...).
5
Д. Бизли «Python. Подробный справочник», СПб.: Символ-Плюс, 2010.
6
Я написал последний справочник в качестве замены справочному приложению, имевшемуся в первом издании этой книги. Он задуман как дополнение к книге, которую вы читаете, а его последнее издание также может служить переправой для читателей, использующих версию Python 2.X. Как уже говорилось в предисловии, книга, которую вы сейчас держите, является учебником, а не справочником, поэтому вам, вероятно, придется в конечном счете найти какой-нибудь источник справочной информации (однако я настолько самонадеян, что предлагаю выбрать мой справочник).
7
Может случиться, что Python видит переменную окружения PYTHONPATH иначе, чем вы. Синтаксическая ошибка в файлах настройки системной оболочки может испортить значение PYTHONPATH, даже если она кажется вам нормальной. Например, в Windows при наличии пробелов вокруг = в команде DOS set в файле с настройками (например, set NAME = VALUE) в переменную NAME в действительности будет записана пустая строка, а не VALUE!
8
Инструкция на языке Python exec(open(file).read()) тоже выполняет код программного файла, но внутри того же процесса, который ее вызвал. В этом отношении она похожа на операцию импортирования, но по своему действию она больше похожа на операцию вставки содержимого файла в вызывающую программу в том месте, где стоит вызов exec (если явно не передаются словари глобального или локального пространства имен). В отличие от операции импортирования, функция exec читает и выполняет программный код файла без всяких проверок (один и тот же файл можно выполнить несколько раз в одном процессе); при выполнении файла не создается объект модуля; и, если функции явно не передаются словари пространств имен, операции присваивания в программном коде файла могут затирать переменные в области видимости, где находится вызов exec. За дополнительными подробностями обращайтесь к руководству по библиотеке Python.
9
Так происходит по умолчанию. Некоторые инструменты запуска программ позволяют сценариям передавать в дочерние программы значения переменных окружения, отличные от своих собственных. Например, функция os.spawnve по своему поведению напоминает функцию os.spawnv, но принимает в виде аргумента дополнительный словарь, представляющий окружение оболочки, которое должно быть передано запускаемой программе. Некоторые разновидности os.exec* (имена которых оканчиваются на «е») тоже принимают явное определение окружения. Подробнее о формате вызова os.exec* рассказывается в главе 5.
10
Обратите внимание, что функция input возбуждает исключение, сигнализируя о конце файла, однако методы чтения файлов просто возвращают в этом случае пустую строку. Поскольку input также отсекает символ конца строки, то при чтении пустой строки из файла также возвращается пустая строка, поэтому исключение совершенно необходимо, чтобы определить конец файла. Методы чтения файлов сохраняют символ конца строки и возвращают для пустых строк символ \n , а не “”. Это одно из отличий прямого чтения из sys.stdin от функции input. Последняя также принимает в качестве аргумента строку приглашения к вводу, которая автоматически выводится перед приемом входных данных.
11
Например, для обработки каналов, описываемых в главе 5. В Python функция os.pipe возвращает два файловых дескриптора, которые можно обрабатывать средствами модуля os или обертывать их объектами файлов с помощью функции os.fdopen. При использовании файловых инструментов из модуля os данные через каналы передаются в виде строк байтов, а не текста. Кроме того, низкоуровневые механизмы могут также потребоваться для работы с некоторыми файлами устройств.
12
Похожие инструменты вы найдете также в модуле shutil, в стандартной библиотеке Python. Он содержит высокоуровневые инструменты для выполнения операций копирования и удаления файлов и многие другие. В главе 6 мы дополнительно напишем инструменты, позволяющие выполнять операции над каталогами, такие как сравнение, копирование и поиск, после того как познакомимся с инструментами для работы с каталогами далее в этой главе.
13
В действительности функция glob просто использует стандартный модуль fnmatch для поиска имен по шаблону; смотрите описание fnmatch в примере модуля find в главе 6.
14
Для этого в Windows нужно щелкнуть на кнопке Пуск (Start), выбрать пункт меню Все программы (AH Programs) ^ Стандартные (Accessories) ^ Служебные (System TooLs) ^ Системный монитор (Resource Monitor) и перейти на монитор ЦП (CP^/За-грузка ЦП (Processor Usage) (аналогичную картину можно наблюдать на вкладке Производительность (Performance) в окне Диспетчера задач (Task Manager) ). Когда я писал эту сноску, на моем ноутбуке график не подымался выше 10% (по крайней мере, пока я не ввел while 1: pass в окне консоли интерактивного сеанса Python...).
15
По крайней мере, в текущей реализации Python функция os.fork в сценарии Python фактически копирует процесс интерпретатора (если взглянуть на список процессов, то после ветвления в нем можно будет найти два процесса Python). Но поскольку интерпретатор Python заботится обо всем, что касается работы сценария, можно считать вызов функции fork непосредственным копированием программы. Собственно, так и будет, если скомпилировать сценарии на языке Python в двоичный машинный код.
16
В примерах использования модуля _thread в этой книге теперь везде используется функция start_new_thread. По исторически сложившимся причинам эта функция доступна также под именем thread.start_new, но в будущих версиях Python этот синоним может быть удален. В версии Python 3.1 оба имени по-прежнему доступны, но в документации, которая выводится функцией help, функция start_new объявлена устаревшей. Другими словами, ее не следует использовать, если вы беспокоитесь о будущем (и что должно учитываться в книге!).
17
Однако их нельзя использовать для непосредственной синхронизации процессов. Поскольку процессы более независимы, им обычно требуются ме
18
ханизмы блокировки, более долговременные и внешние по отношению
19
к программам. Вызов функции os.open, представленной в главе 4, с флагом
20
O_EXCL позволяет сценариям блокировать и разблокировать доступ к файлам и потому может считаться идеальным инструментом блокировки для использования в процессах. Обратите также внимание на инструменты син
21
хронизации в модулях multiprocessing и threading, а также прочитайте раздел
22
организации взаимодействий между процессами далее в этой главе, где представлены другие универсальные приемы синхронизации.
23
Пояснение для программистов Java: блокировки и условные переменные в языке Python являются отдельными объектами, а не чем-то присущим всем объектам, а класс Thread в языке Python не обладает всеми характеристиками, которые есть у одноименного класса в языке Java. Дополнительные детали можно найти в руководстве по библиотеке Python.
24
Понятия «клиент» и «сервер» будут разъяснены в части книги, посвященной приложениям для Интернета. Там взаимодействие будет организовано с помощью сокетов (с которыми мы встретимся далее в этой главе и которые грубо можно назвать двунаправленными каналами связи между программами, выполняющимися на компьютерах, соединенных сетью, или на одном и том же компьютере), но модель обмена информацией в целом остается схожей. Именованные каналы (fifo), описываемые ниже, лучше соответствуют модели клиент/сервер, поскольку доступ к ним может осуществляться произвольными, несвязанными процессами (выполнять ветвление при этом не требуется). Но как мы увидим, модели сокетов повсеместно используются большинством протоколов сценариев для Интернета - сообщения электронной почты, например, являются, по сути, всего лишь форматированными строками, передаваемыми между программами через сокеты со стандартными номерами портов, зарезервированными для протоколов обмена электронной почтой.
25
Сходная проблема, связанная с функцией print, описывается в главе 14, где предлагается обходное решение, позволяющее предотвратить аварийное завершение программы в случае вывода трассировочной информации в поток стандартного вывода порожденными программами. В отличие от проблемы, описываемой здесь, та проблема, похоже, не связана с выводом символов Юникода, которые могут оказаться непечатаемыми в окне командной оболочки, а отражает еще один недостаток механизма вывода в стандартный поток вывода в версии Python 3.1, который может быть исправлен к моменту, когда вы будете читать эти строки. Смотрите также описание переменной окружения PYTH0NI0ENC0DING, с помощью которой можно переопределить кодировку, используемую по умолчанию для стандартного потока вывода.
26
Необходимо отметить, что эту историю я рассказывал еще во втором издании книги, которое вышло в 2000 году. За последние десять лет гибкие диски практически закончили путь, который уже прошли параллельные порты и динозавры. Кроме того, запись CD или DVD выполняется не так долго, как прежде; в настоящее время появились новые возможности, такие как флешки огромного объема, беспроводные сети и даже простая электронная почта; и, естественно, у меня дома теперь стоят более совершенные компьютеры. А что касается моих детей - некоторые из них уже выросли (хотя и сохранили некоторую обратную совместимость с ними прежними).
27
Как оказывается, команды zip, gzip и tar также можно заменить программным кодом на языке Python. В стандартной библиотеке имеется модуль gzip, который предоставляет инструменты чтения и записи файлов gzip, имена которых обычно имеют расширение .gz. Он служит в Python общим эквивалентом стандартных утилит командной строки gzip и gunzip. Этот встроенный модуль в свою очередь использует модуль zlib, в котором реализовано gzip-совместимое сжатие данных. В последних версиях Python присутствуют также модуль zipfile для обработки архивов в формате ZIP (zip - это формат архивных файлов и сжатия, а gzip - это алгоритм сжатия) и модуль tarfile, позволяющий сценариям работать с tar-архивами. Подробности ищите в руководстве по библиотеке Python.
28
Это случается. Действительно, почти все, кто проводит в киберпространстве значительное время, могут рассказать пару ужасных историй. Моя состоит в следующем: несколько лет тому назад я пользовался услугами провайдера, который полностью отключился от Интернета на несколько недель из-за проникновения в систему защиты бывшего служащего. Что еще хуже, персональная электронная почта не просто не работала, но накапливавшиеся сообщения были утеряны навсегда. Если ваше существование зависит от электронной почты и Веб в такой же мере, как мое, вы хорошо представляете, какую панику может вызвать подобное отключение.
29
Среди разработчиков, проведших в гетто Unix достаточное время, операция поиска в файлах часто носит разговорное название «grepping».
30
Термин «набор графических элементов» означает объекты, используемые для создания привычных элементов интерфейса «укажи-и-щелкни» - кнопок, ползунков, полей ввода и так далее. В библиотеке tkinter определяются классы Python, соответствующие всем графическим элементам, к которым вы привыкли в графических интерфейсах. Помимо графических элементов в tkinter присутствуют также инструменты для решения иных задач, таких как планирование событий, ожидание появления данных в сокетах и так далее.
31
В данной книге «Windows» относится к интерфейсу Microsoft Windows, распространенному на PC, а «X Window» относится к интерфейсу X11, чаще всего встречающемуся на платформах Unix и Linux. Эти два интерфейса в целом привязаны к платформам Microsoft и Unix (и Unix-подобным), соответственно. Существует возможность выполнения X Window поверх операционной системы Microsoft и эмуляции Windows в Unix и Linux, но эта возможность используется достаточно редко. Чтобы добавить туману, замечу, что Mac OS X обеспечивает поддержку tkinter в X Window и в родной графической подсистеме Aqua, в дополнение к платформозависимой поддержке cocoa (хотя обычно особенности OS X не слишком выделяются в коктейле Unix-подобных систем).
32
Формально вызов mainloop возвращает управление сценарию только после выхода из цикла событий. Обычно это происходит при закрытии главного окна, но может случиться и в ответ на явный вызов метода quit, который завершает вложенный цикл событий, но оставляет окно открытым. Почему это имеет значение, вы узнаете в главе 8.
33
Совет: Как уже предлагалось выше, при вводе программного кода, использующего библиотеку tkinter, в интерактивной оболочке, вам может не потребоваться вызывать функцию mainloop, чтобы отобразить виджеты. Это необходимо делать в текущей версии IDLE, но в простом интерактивном сеансе, запущенном в окне консоли, этого может не потребоваться. В любом случае управление будет возвращено интерактивной оболочке, как только вы закроете созданное окно. Примечательно, что если явно создать виджет главного окна вызовом конструктора Tk() и присоединить к нему виджеты (как описывается ниже), вам придется вызвать его снова после закрытия окна, иначе окно приложения не появится.
34
Если рассмотреть главный файл tkinter в библиотеке исходного программного кода Python (в настоящее время Lib\tkinter\__init__.py), можно заме
тить, что имена модулей, не предназначенных для экспорта, начинаются с одного символа подчеркивания. Python не копирует такие имена при обращении к модулю в операторе from в формате *. Модуль с константами называется constants.py и находится в том же самом каталоге пакета, хотя с течением времени имя и местоположение его может измениться*
35
В действительности именованные аргументы впервые появились в Python, чтобы сделать более очевидными такие вызовы tkinter. Внутри интерпретатора именованные аргументы передаются как словарь (который можно получить, указав аргумент вида **name в инструкции def объявления функции), поэтому обе схемы аналогичны по реализации. Но они отличаются количеством символов, которые нужно ввести и проверить.
36
Бывшим программистам на языке Tcl, возможно, будет интересно узнать, что Python не только внутренне строит дерево виджетов, но и использует его для автоматического создания строк путей к виджетам, которые приходится вручную писать в Tcl/Tk (например, .panel.row.cmd). Python использует адреса объектов классов виджетов, помещает их в компоненты пути и сохраняет полученные пути в дереве виджетов. Например, метке, прикрепленной к контейнеру, может быть присвоено внутреннее имя, такое как .8220096.821 9408. Однако вас это не должно волновать. Просто создавайте и связывайте объекты графических элементов, передавая их родителей, и предоставьте Python самому работать с путями, опираясь на дерево объектов. Дополнительные сведения об отношениях Tk и tkinter приводятся в конце главы.
37
Технически после изменения размеров окна этапы добавления просто выполняются заново. Но поскольку это означает, что для графических элементов, добавляемых последними, останется недостаточно места, это равносильно тому, что элементы, добавленные последними, обрезаются первыми.
38
Если заглянуть в исходные тексты модуля tkinter (главным образом в файл __init__.py в каталоге Lib\tkinter), можно заметить, что многие из создаваемых им имен атрибутов начинаются с одного символа подчеркивания, что делает их уникальными; другие имена - нет, поскольку они могут быть полезны за пределами реализации tkinter (например, self.master, self. children). Странно, но библиотека tkinter по-прежнему не использует трюк с «псевдочастными» атрибутами Python, имена которых начинаются с двух символов подчеркивания, что влечет за собой автоматическое добавление имени содержащего их класса и локализации для создающего класса. Если библиотека tkinter будет когда-нибудь переписана так, чтобы использовать эту особенность, конфликты имен в подклассах виджетов будут происходить гораздо реже. Большинство атрибутов классов виджетов являются методами, предназначенными для использования в клиентских сценариях; имена, начинающиеся с одного символа подчеркивания, могут использоваться тоже, но при этом вероятность конфликтов имен все-таки ниже.
39
Всемирно известный производитель товаров для детского творчества, в том числе цветных карандашей, красок, мелков, фломастеров и пр. - Прим. ред.
40
Видимо, у автора установлены какие-то дополнительные драйверы от производителя мыши. В стандартной поставке Windows такая настройка отсутствует. - Прим. ред.
41
Исторический анекдот: в устаревшей в данное время версии tkinter, поставлявшейся с Python 1.3, можно было также устанавливать и извлекать значения переменных, обращаясь к ним как к функциям с аргументами или без (например, var(value) и var()). В настоящее время вместо этого нужно вызывать методы set и get переменных. По неустановленным причинам функциональная форма вызова прекратила работать годы назад, хотя ее все еще можно встретить в старом программном коде на языке Python (и в первых изданиях, по крайней мере, одной книги по языку Python, выпущенной издательством O’Reilly). Если исправление, выполненное из эстетических соображений, приводит к неработоспособности существующего программного кода, можно ли его считать исправлением?
42
Не я автор данной картинки - она появилась в качестве баннера на сайтах для разработчиков, таких как slashdot.com, когда в 1999 году вышло первое издание «Learning Python». Она породила такую волну возмущения приверженцев Perl, что издательство O’Reilly в конце концов было вынуждено убрать эту рекламу. Хотя возможно, именно поэтому она оказалась в этой книге.
43
Использована цитата из фильма Стенли Кубрика «Сияние». - Прим. ред.
44
О технике анимации рассказывается в конце данного обзора. Поскольку в область отрисовки холста можно встраивать другие виджеты, собственная координатная система делает холсты идеальными инструментами для реализации графических интерфейсов, дающих пользователям возможность создания других графических интерфейсов путем перетаскивания встроенных виджетов по холсту - весьма полезное применение холста, которое мы изучили бы в этой книге, будь у меня несколько сотен лишних страниц.
45
Я решил обратить ваше внимание на это, поскольку считаю, что понимание опасности позволит в будущем избежать ее - если процесс Python обладает правом удаления файлов, передача функции eval строки с программным
кодом__import__(‘ os’ ). system(‘ rm -rf *’ ) в Unix приведет к вызову команды
оболочки, которая удалит все файлы в текущем каталоге и во вложенных в него подкаталогах (в Windows аналогичный эффект можно получить с помощью команды ‘ rmdir /S /Q . ’). Не делайте этого! Чтобы увидеть менее опасное и более полезное применение этой особенности, введите выражение__import__(‘ math’ ). pi в одну из ячеек таблицы - щелчок на кнопке Sum
вычислит значение pi (3.14159). Также безопасно будет передать функции
eval выражение “__import__(‘os’ ). system( ‘ di r’)” в интерактивном сеансе. Все
вышесказанное относится и к встроенной функции exec - функция eval выполняет строки выражений, функция exec - инструкции, а выражения являются инструкциями (но не наоборот). Разумеется, обычный пользователь графического интерфейса едва ли введет подобный программный код случайно, особенно если этот пользователь вы сами, но будьте внимательны!
46
Игра-симулятор пинг-понга, появившаяся в 1972 году и ставшая прародительницей таких известных игр, как Breakout и Arkanoid. - Прим. перев.
47
Самая известная, пожалуй, компания Eve Online по производству игровых программ использует Python для создания сценариев и значительной доли функциональности - не только для серверной, но и для клиентской части. Она использует версию Stackless Python, чтобы обеспечить высокую отзывчивость интерфейса при большом количестве параллельно выполняющихся заданий. Из других известных компаний, использующих Python, можно назвать производителя игры Civilization IV и ныне несуществующую Origin Systems (в последних сообщениях говорилось, что их игра Ultima Online II должна была использовать Python для поддержки анимации).
48
Имеется в виду модель автомобиля «Chevrolet Camaro», пользующаяся славой надежного и неприхотливого автомобиля. - Прим. перев.
49
Названия всех крупных примеров этой книги начинаются с приставки «Py». Это - соглашение, принятое в мире Python. Если покопаться на сайте http://www.python.org, можно найти другое свободно распространяемое программное обеспечение, следующее этой схеме именования: PyOpenGL (интерфейс к графической библиотеке OpenGL для языка Python), PyGame (набор инструментов для разработки игровых программ на языке Python) и многие другие. Я не знаю, с кого это началось, но эта схема оказалась достаточно «Пи-кантным» способом рекламы языка программирования для всего мира программного обеспечения с открытыми исходными текстами. Если Питонист слишком прямолинеен - это не Питонист!
50
Интересно отметить, что даже текстовый редактор IDLE в Python 3.1 страдает от тех же двух ошибок, описываемых здесь и ликвидированных в текущей версии PyEdit, - IDLE в версии 3.1 вставляет содержимое файла при открытии начиная со второй строки, а его операция поиска во внешних файлах (напоминающая диалог Grep в PyEdit) вызывает крах в результате ошибки декодирования при просмотре стандартной библиотеки Python, что вызывает аварийное завершение IDLE. Здесь вполне уместно вспомнить поговорку про сапожника без сапог...
51
Здесь игра слов: имя метода pack_forget дословно означает «забыть, что был скомпонован». - Прим. перев.
52
Чтобы не выставлять программистов в невыгодном свете, следует отметить, что ко мне неоднократно обращались с просьбами прочитать лекции о программировании на языке Python для физиков, которые имели более богатую математическую практику, чем я, но многие из которых благополучно злоупотребляли общими блоками и операторами GO TO языка FORTRAN. Специализация в профессиональной деятельности может всех нас в чем-то превратить в новичков.
53
В ноябре 2010 года вышла версия NumPu 1.5.1 для Python 3.1. - Прим. перев.
54
Кроме этого следует учитывать, что, в отличие от координатных осей, используемых в планиметрии, на которых значения по оси Y возрастают снизу вверх (ось направлена вверх), на холсте ось Y направлена вниз. Это приводит к тому, что для вычисления на холсте позиции по Y вычисленная для точки координата Y вычитается из начальной координаты Y, а не прибавляется к ней, как в случае со значениями по оси X. - Прим. ред.
55
После прибавления значения вычисленной координаты по X и вычитания значения по Y. - Прим. ред.
56
Например, сценарий PyDemos, представленный в предыдущей главе, запускает семь часов, выполняющихся в одном процессе, и во всех них обновление времени на моем (относительно медленном) нетбуке, работающем под управлением Windows 7, происходит плавно. Все вместе они потребляют единицы процентов мощности ЦП и нередко даже меньше, чем сама программа Диспетчер задач (Task Manager).