2to3 -l Available transformations for the -f/--fix option: (Доступные исправления для параметра -f/--fix) apply basestring buffer Перенос программного кода и утилита 2to3 791callable ......xrange xreadlines zip Используя имена из этого списка, можно посмотреть, какие фактические изменения внесет выбранное исправление, просто выполнив команду 2to3 -f исправление имя_файла. Если необходимо применить сразу несколько ис- правлений, их можно указать в виде последовательности из нескольких параметров -f, по одному для каждого исправления. Если вам потребуется внести фактические исправления в исходный файл, добавьте ключ -w: 2to3 -f исправление -w имя_файла . Например: % 2to3 -f xrange -w example.py--- example.py (original) +++ example.py (refactored) @@ -1,7 +1,7 @@ # example.py import ConfigParser -for i in xrange(10): +for i in range(10): print i, 2*i ёёё def spam(d): RefactoringTool: Files that were modified: RefactoringTool: example.py Если заглянуть в файл example.py после выполнения этой операции, можно обнаружить, что вызов функции xrange() был замещен вызовом функции range() и больше никаких других изменений внесено не было. Резервная копия оригинального файла example.py сохраняется под именем example. py.bak Противоположностью ключу -f является ключ -x. Если выполнить коман- ду 2to3 -x исправление имя_файла, она проверит необходимость выполнения всех исправлений, кроме тех, что указаны в параметре -x. Несмотря на то что утилита 2to3 может вносить исправления непосред- ственно в исходные файлы, тем не менее на практике этого лучше избегать. Имейте в виду, что интерпретация программного кода не может выпол- няться абсолютно точно, и поэтому утилита 2to3 не всегда «права в своем выборе». При переносе программного кода всегда лучше подходить к этой проблеме методично и последовательно, а не полагаться на авось и на то, что все «заработает» чудесным образом. Утилита 2to3 обладает парой дополнительных параметров, которые могут пригодиться. Ключ -v включает режим подробного вывода, когда выводит- ся дополнительная информация, которая может пригодиться при отлад- ке. Ключ -p сообщает утилите 2to3, что вы уже используете инструкцию print как функцию и что ее исправлять нет необходимости (включается ин- струкцией from __future__ import print_statement). 792Приложение A. Python 3 Практическая стратегия переносаН иже представлено описание практической стратегии переноса программ- ного кода с версии Python 2 на версию Python 3. Напомню еще раз, что всег- Python 2 на версию Python 3. Напомню еще раз, что всег- 2 на версию Python 3. Напомню еще раз, что всег- Python 3. Напомню еще раз, что всег- Напомню еще раз, что всег- да лучше подходить к этой проблеме методично и не стремиться решить ее одним махом. 1. Убедитесь, что программа имеет достаточное количество модульных тестов и что все тесты безошибочно выполняются под управлением Py- Py- thon 2. 2. Перенесите программу и комплект тестов на версию Python 2.6 и убеди- Python 2.6 и убеди- 2.6 и убеди- тесь, что все тесты выполняются безошибочно. 3. Добавьте параметр -3 в вызов интерпретатора Python 2.6. Изучите все предупреждения и измените программу так, чтобы она выполнялась и проходила все тесты без вывода предупреждений. Если все было сде- лано правильно, есть вероятность, что программа по-прежнему сможет работать под управлением Python 2.5 и, может быть, под управлением еще более ранних версий. На данном этапе вы просто убрали из про- граммы всякий «хлам». 4. Создайте резервную копию программы (это должно быть сделано без лишних напоминаний). 5. Перенесите комплект модульных тестов на Python 3 и убедитесь, что среда тестирования работоспособна сама по себе. Отдельные модульные тесты будут терпеть неудачу (потому что перенос программы еще не был выполнен). Однако корректно написанные тесты должны быть способ- ны обнаруживать отказы, не завершаясь аварийно из-за внутренних проблем самой системы тестирования. 6. С помощью утилиты 2to3 перенесите саму программу на Python 3. За- Python 3. За- 3. За- пустите тестирование получившегося программного кода и исправьте все обнаруженные проблемы. Существуют различные стратегии выпол- нения этого этапа. Если вы считаете себя любимцем фортуны, можете позволить утилите 2to3 исправить все, что она посчитает нужным, и по- смотреть, что из этого получится. Если вы более осторожны, исправьте с помощью утилиты 2to3 наиболее очевидные проблемы (инструкции print и except, функцию xrange(), имена библиотечных модулей и так далее), а затем постепенно разберитесь с оставшимися проблемами. По окончании этого процесса ваша программа должна проходить все тесты и действовать точно так же, как и прежде. Теоретически возможно структурировать программный код так, что он бу- дет работать как под управлением Python 2.6, так и под управлением Py- Python 2.6, так и под управлением Py- 2.6, так и под управлением Py- Py- thon 3, без какого-либо вмешательства со стороны пользователя. Однако для этого придется очень тщательно следовать современным соглашениям по оформлению программного кода на языке Python; по крайней мере, вам совершенно точно придется добиться того, чтобы в процессе работы под управлением Python 2.6 не выводилось никаких предупреждений. Если для автоматического переноса программного кода требуется специфиче- ское использование утилиты 2to3 (например, запуск с определенным на- Перенос программного кода и утилита 2to3 793 бором исправлений), вероятно, лучше будет написать сценарий на языке командной оболочки, который автоматически будет выполнять необходи- мые операции и избавит пользователей от необходимости самостоятельно пользоваться утилитой 2to3. Одновременная поддержка Python 2 и Python 3 Последний вопрос, касающийся переноса программного кода на Py- Py- thon 3, – возможно ли иметь единый программный код, который без допол- нительных модификаций будет выполняться под управлением Python 2 и Python 3? В некоторых случаях такое вполне возможно, однако при этом возникает опасность, что программный код превратится в жуткую меша- нину. Например, вам придется ликвидировать все инструкции print и убе- диться, что ни одна из инструкций except не извлекает значения исклю- чений (а вся необходимая информация извлекается с помощью функции sys.exc_info() ). Некоторые особенности языка Python вообще невозможно заставить одновременно работать под управлением разных версий интер- претатора. Например, из-за различий в синтаксисе нет никакой возмож- ности реализовать такой способ использования метаклассов, который был бы совместим с версиями Python 2 и Python 3. Таким образом, если в вашем распоряжении имеется программный код, который должен работать под управлением Python 2 и Python 3, в пер- Python 2 и Python 3, в пер- 2 и Python 3, в пер- Python 3, в пер- 3, в пер- вую очередь из него необходимо устранить использование любых нереко- мендуемых возможностей, убедиться, что он работает под управлением Python 2.6, обеспечить максимально полный охват модульными тестами и попытаться подобрать такое подмножество параметров утилиты 2to3, чтобы обеспечить возможность автоматического преобразования. Примером варианта создания программной базы, единой для разных вер- сий Python, может послужить комплект модульных тестов. Очень полезно иметь набор тестов, которые без дополнительных модификаций действуют в Python 2.6 и Python 3, – для проверки корректности поведения приложе- Python 2.6 и Python 3, – для проверки корректности поведения приложе- 2.6 и Python 3, – для проверки корректности поведения приложе- Python 3, – для проверки корректности поведения приложе- 3, – для проверки корректности поведения приложе- ния после его преобразования с помощью утилиты 2to3. Участие в проекте Как проект с открытым исходным кодом, Python продолжает развиваться благодаря содействию его пользователей. Для дальнейшего развития Py- Py- thon 3 разработчикам особенно важно получать отчеты об ошибках, о про- 3 разработчикам особенно важно получать отчеты об ошибках, о про- блемах с производительностью и о других недостатках. Отправить отчет об ошибке можно на странице http://bugs.python.org. Не стесняйтесь – ваши отзывы помогут сделать Python еще лучше.
Алфавитный указательСимволы и цифры''' (тройные апострофы), 30, 51 """ (тройные кавычки), 30, 51 ' (апостроф), 30, 51 " (кавычки), 30, 51 - (дефис), использование вместо имени файла, 227 - (дефис), оператор разности множеств, 36 - унарный минус, оператор, 96 - оператор вычитания, 96 () (скобки) в кортежах, 33, 54 () оператор вызова функции, 110 _ (подчеркивание) в идентификаторах, 50 _ (подчеркивание), переменная, 24 в интерактивном режиме, 230 _ _(два символа подчеркивания) в иден- тификаторах, 50 . (точка), оператор доступа к атрибутам класса, 159 . (точка), оператор доступа к атрибутам, 58, 77, 110 ... (многоточие), 55, 84 ... приглашение к вводу, 230 ; (точка с запятой), как разделитель ин- струкций, 26, 49 : (двоеточие), в спецификаторах форма- та, 106 @ декораторы, 55, 139 #! в сценариях командной оболочки в UNIX, 231 переопределение при установке паке- тов, 202 # символ начала комментария, 25, 49 \\ символ продолжения строки, 48 \\ экранированные последовательности в строковых литералах, 51, 52 % оператор форматирования строк, 27, 103 % оператор деления по модулю, 96 // оператор деления с усечением, 96 * шаблонный символ в инструкции from module import, 191 импортирование определений из мо- дуля, 47 передача функциям последователь- ностей аргументов, 131 передача функциям словарей имено- ванных аргументов, 132 переменное число аргументов функ- ций, 131 * оператор умножения, 96 * оператор копирования последователь- ностей, 99 ** переменное количество именованных аргументов, в объявлении, 132 ** оператор возведения в степень, 96 **= оператор, 109 *= оператор, 109 >>> приглашение к вводу, 23, 229 >> модификатор перенаправления вы- вода в файл, 212 & битовая операция И, 97 & оператор пересечения множеств, 36, 109 &= оператор, 110 | битовая операция ИЛИ, 97 битовая операция НЕ, 97 > (больше чем), оператор отношения, 29, 98 < (меньше чем), оператор отношения, 29, 98 < выравнивание по левому краю, в специ фикаторах формата, 106 > выравнивание по правому краю, в спецификаторах формата, 106 >>, оператор перенаправления в файл в инструкции print, 29 << оператор сдвига влево, 97 >> оператор сдвига вправо, 97 <<= оператор, 110 >>= оператор, 110 -= оператор, 109 Алфавитный указатель 795//= оператор, 109 /= оператор, 109 %= оператор, 109 += оператор, 109 |= оператор, 110 >= оператор больше или равно, 98 <= оператор меньше или равно, 98 != оператор не равно, 98 == оператор равенства, 98, 113 | оператор объединения множеств, 36, 109 / оператор деления, 96 + оператор конкатенации, 99 списков, 32 строк, 31 + унарный плюс, оператор, 96 + оператор сложения, 96 ^ битовая операция исключающее ИЛИ, 97 ^ оператор симметричной разности мно- жеств, 36, 109 ^ выравнивание по центру, в специфика- торах формата, 106 ^= оператор, 110 {} символы подстановки в строках фор- мата, 106 {} словари, 36, 54 литералы множеств, 772 [] списки, 32, 54 [] оператор индексирования, 65, 99 в отображениях, 72 и специальные методы, 90 при работе с последовательностями, 100 [:] оператор среза, 31, 32, 65, 99 [::] расширенный оператор среза, 65, 99 при работе с последовательностями, 101 [!] команда отладчика, модуль pdb, 243 0b, литералы двоичных чисел, 50 0o, литералы восьмеричных чисел, 50 0x, литералы шестнадцатеричных чи- сел, 50 2to3, утилита, 788 ограничения, 790 -3, параметр командной строки, 226, 788 A'a', режим, в функции open(), 207 a2b_base64(), функция, модуль binascii, 680 a2b_hex(), функция, модуль binascii, 680 a2b_hqx(), функция, модуль binascii, 680 a2b_uu(), функция, модуль binascii, 680 ABCMeta, метакласс, 182, 326 abc, модуль, 182, 326 abort(), метод объектов класса FTP, 620 abort(), функция, модуль os, 489 abspath(), функция, модуль os.path, 496 __abstractmethods__, атрибут объекта types , 79 @abstractmethod, декоратор, 182, 326 @abstractproperty, декоратор, 182, 326 __abs__(), метод, 93 abs(), функция, 97, 259 модуль operator, 346 accept2dyear, переменная, модуль time, 507 accept(), метод объектов класса dispatcher, 569 объектов сокетов, 596 accept(), метод объектов класса Listener, 542 access(), функция, модуль os, 484 acosh(), функция, модуль math, 319 acos(), функция, модуль math, 319 acquire(), метод объектов класса Condition, 552 объектов класса Lock, 548 объектов класса RLock, 549 объектов класса Semaphore, 549 activate(), метод объектов SocketServer, 615 active_children(), функция, модуль multiprocessing, 543 active_count(), функция, модуль threading, 555 __add__(), метод, 92, 179 add(), метод множеств, 36, 74 объектов класса TarFile, 403 add(), функция, модуль operator, 346 add_data(), метод объектов класса Request, 642 addfile(), метод, объектов класса TarFile, 403 addFilter(), метод объектов класса Handler, 456 объектов класса Logger, 450 addHandler(), метод объектов класса Logger, 453 add_header(), метод объектов класса Message, 690 объектов класса Request, 643 796 Алфавитный указатель addLevelName(), функция, модуль logging, 460 add_option(), метод, модуль optparse, 206 add_option(), метод объектов класса PtionParser, 470 add_password(), метод объектов AuthHandler, 645 address_family, атрибут объектов SocketServer, 615 addressof(cobj), функция, модуль ctypes, 765 address, атрибут объектов класса BaseManager, 539 объектов класса Listener , 542 add_section(), метод объектов класса ConfigParser, 417 add_type(), функция, модуль mimetypes, 704 add_unredirected_header(), метод объек- тов класса Request, 643 adler32(), функция, модуль zlib, 413 AF_*, константы, модуль socket, 586 aifc, модуль, 729 AJAX, технология, пример, 661 alarm(), функция, модуль signal, 500 alias, команда отладчика, модуль pdb, 243 alignment(), функция, модуль ctypes, 765 __all__, переменная в пакетах, 198 и инструкции импортирования, 192 all(), функция, 66, 99, 259 allow_reuse_address, атрибут объектов SocketServer, 615 altsep, переменная, модуль os, 484 altzone, переменная, модуль time, 507 __and__(), метод, 92 and, логический оператор, 113 and_(), функция, модуль operator, 346 __annotations__, атрибут функций, anydbm, модуль, 392 any(), функция, 66, 99, 259 api_version, переменная, модуль sys, 293 %APPDATA%, переменная окружения в Windows, 232 append(), метод объекта типа deque, 333 объектов класса Element, 715 объектов типа array, 329 списков, 32, 66 appendChild(), метод объектов класса Node, 709 appendleft(), метод, объекта типа deque, 333 apply_async(), метод объектов класса Pool, 530 apply(), метод объектов класса Pool, 530 args, атрибут исключений, 125 объекта Exception, 274 args, атрибут, объектов типа partial, 340 a(rgs) , команда отладчика, модуль pdb, 243 argtypes, атрибут объектов функций в модуле ctypes, 760 argv, переменная, модуль sys, 33, 205, 228, 293 ArithmeticError, исключение, 123, 273 Array(), метод объектов класса Manager, 536 array, модуль, 328 array(), функция модуль array, 329 модуль multiprocessing, 533 arraysize, атрибут объектов типа Cursor, 378 as, квалификатор в инструкции from-import, 191 в инструкции import, 46, 190 в инструкции except, 45 as, модификатор в инструкции except, 121 в инструкции with, 127 ASCII, кодировка и совместимость с UTF-8, 221 описание, 220 ascii(), функция, 259 и Python 3, 260 ascii_letters, переменная, модуль string, 362 ascii_lowercase, переменная, модуль string, 362 ascii_uppercase, переменная, модуль string, 362 asctime(), функция, модуль time, 508 asin(), функция, модуль math, 319 asinh(), функция, модуль math, 319 as_integer_ratio(), метод чисел с плаваю- щей точкой, 64 assert, инструкция, 128, 275 удаление с помощью ключа -O, 195 assert_(), метод объекта TestCase, 241 assertAlmostEqual(), метод
Алфавитный указатель 797объекта TestCase, 241 assertEqual(), метод объекта TestCase, 241 AssertionError, исключение, 123, 128, 275 assertNotAlmostEqual(), метод объекта TestCase, 241 assertNotEqual(), метод объекта TestCase, 241 assertRaises(), метод объекта TestCase, 241 as_string(), метод объектов класса Message, 690 astimezone(), метод объектов класса datetime, 426 async_chat, класс, модуль asyncchat, 565 asynchat, модуль, 564 использование, 582 asyncore, модуль, 519, 564, 568 использование, 582 AsyncResult, класс, модуль multiprocessing, 531 atan2(), функция, модуль math, 319 atanh(), функция, модуль math, 319 atan(), функция, модуль math, 319 atexit, метод, 234 atexit, модуль, 280 attach(), метод объектов класса Message, 690 attrgetter(), функция, модуль operator, 348 attrib, атрибут объектов класса Element, 715 AttributeError, исключение, 123, 275 и связывание атрибутов, 177 attributes, атрибут объектов класса Node, 708 audioop, модуль, 729 authkey, атрибут объектов класса Process, 521 awk, команда UNIX, сходство с генера- торами списков, 152 B-b, параметр командной строки, 226 b, префикс в строковых литералах, 54 b2a_base64(), функция, модуль binascii, 680 b2a_hex(), функция, модуль binascii, 680 b2a_hqx(), функция, модуль binascii, 681 b2a_uu(), функция, модуль binascii, 680 b16decode(), функция, модуль base64, 679 b16encode(), функция, модуль base64, 679 b32decode(), функция, модуль base64, 679 b32encode(), функция, модуль base64, 679 b64decode(), функция, модуль base64, 678 b64encode(), функция, модуль base64, 678 'backslashreplace', политика обработки ошибок при кодировании строк Юни- кода, 217 BadStatusLine, исключение, модуль http.client, 628 base64, модуль, 677 base64, формат, описание, 677 BaseCGIHandler(), функция, модуль wsgiref.handlers, 674 BaseException, исключение, 123, 273 BaseHTTPRequestHandler, класс, мо- дуль http.server, 632 BaseHTTPServer, модуль, 630 BaseManager, класс, модуль multiprocessing, 538 BaseManager(), функция, модуль multiprocessing, 538 basename(), функция, модуль os.path, 496, 499 BaseProxy, класс, модуль multiprocessing, 541 BaseRequestHandler, класс, модуль SocketServer, 611 __bases__, атрибут классов, 176 объекта types, 79 basestring, переменная, 260 basicConfig(), функция, модуль logging, 446 BasicContext, переменная, модуль decimal, 315 .bat, файлы, в Windows, 231 bdb, модуль, 725 Beautiful Soup, пакет, 699 betavariate(), функция, модуль random, 324 bin(), функция, 112, 260 Binary(), функция интерфейс доступа к базам данных, 381 модуль xmlrpc.client, 654 |