Различия и изменения в синтаксисе python2 и python3
Почти все программы Python 2 нуждаются в некоторых изменениях, чтобы нормально работать в среде Python 3. Чтобы упростить этот процесс преобразования, Python 3 поставляется с практическим скриптом, называемым 2to3 (Utility Script), который принимает исходные файлы вашей программы Python 2 в качестве ввода, а затем автоматически преобразует их в форму Python 3.
В Python 2 print - это предложение. Что бы вы ни хотели вывести, вы можете сделать это, просто поместив их за ключевым словом print. В Python 3 print () - это функция. Как и другие функции, print () требует, чтобы вы передали в качестве параметров то, что вы хотите вывести.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | print() | |
| ② | print 1 | print(1) |
| ③ | print 1,2 | print(1,2) |
| ④ | print 1,2, | print(1,2,end=' ') |
| ⑤ | print >>sys.stderr,1,2,3 | print(1,2,3, file=sys.stderr) |
- Для вывода пустой строки необходимо вызвать print без параметров ((() ◦
- Для вывода отдельного значения необходимо использовать это значение в качестве одного из параметров print ().
- Для вывода используйте два значения, разделенные пробелом, используйте два параметра для вызова print ((().
В Python 2, если вы используете запятую ((,) в качестве окончания print фразы, она будет разделять результаты вывода с помощью пробелов, а затем выводить следующий пробел ((trailing space), а не выводы carriage return). В Python 3 такой же эффект может быть достигнут путем передачи end=' ' в качестве ключевого параметра print ().
В Python 2 вы можете выполнять ту же функцию, перенаправляя вывод в одну трубу, например, sys.stderr, используя синтаксис>>pipe_name. В Python 3 вы можете сделать то же самое, передавая значение трубы в качестве ключевого слова в параметре файла print (((). По умолчанию параметры файла std.stdout, поэтому переназначение его значения приведет к тому, что print ((() будет выводиться в другую трубу.
В Python 2 существует два типа струн:Строка UnicodeиНеуникодные строкиВ Python 3 есть только один тип:Unicode strings (Уникодные строки)。
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | u'PapayaWhip' | 'PapayaWhip' |
| ② | ur'PapayaWhip\foo' | r'PapayaWhip\foo' |
Unicode-стринги в Python 2 являются обычными в Python 3, поскольку в Python 3 они всегда имеют форму △.
Unicode raw string ((raw string) (() использует эту строку, Python не переводит обратную скобку автоматически"") также заменен на обычные строки, так как в Python 3 все исходные строки кодируются в Unicode <unk>.
В Python 2 есть две глобальные функции, которые могут принудительно преобразовывать объекты в строки: unicode ((() преобразовывает объекты в Unicode строки, и str ((() преобразовывает объекты в не-Unicode строки. В Python 3 есть только один тип строки, Unicode строки, поэтому str ((() функция может выполнять все функции.Функция unicode() больше не существует в Python 3.)
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | unicode(anything) | str(anything) |
В Python 2 имеются типы int и long для не-флоктовых чисел. Максимальное значение типа int не может превышать sys.maxint, и это максимальное значение зависит от платформы. Длинные целочисленные типы можно определить, прикрепив L к концу числа, что, очевидно, больше, чем числовой диапазон, обозначенный типом int.
PEP 237: унификация длинных и целых типов.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | x = 1000000000000L | x = 1000000000000 |
| ② | x = 0xFFFFFFFFFFFFL | x = 0xFFFFFFFFFFFF |
| ③ | long(x) | int(x) |
| ④ | type(x) is long | type(x) is int |
| ⑤ | isinstance(x,long) | isinstance(x,int) |
В Python 2 десятичное длинное целое число было заменено на обычное десятичное целое число в Python 3.
В Python 2 шестнадцатизначный длинный целочисленный тип заменен в Python 3 обычным шестнадцатизначным целочисленным числом.
В Python 3 нет более длинных целостных типов, поэтому мы можем использовать их для создания более длинных целых типов.Природная функция long () также отсутствует. Для принудительного преобразования переменной в целостный тип можно использовать функцию int ()。
Проверка целостности переменной, получение ее типа данных и сравнение с переменной типа int ((не long)).
Вы также можете использовать функцию insinstance () для проверки типа данных; подчеркнем, что для проверки типа целых чисел используйте int, а не long.
Python 2 поддерживает <> как синоним!=. Python 3 поддерживает только!=, больше не поддерживает <>.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | if x <> y: | if x != y: |
| ② | if x <> y<> z: | if x != y!= z: |
- Просто сравнить.
2, сравнение трех относительно сложных значений.
В Python 2 словарный объект has_key ((() - метод, используемый для проверки того, содержит ли словарь определенную клавишу (((key) <unk>. Этот метод больше не поддерживается в Python 3 <unk>. Вам нужно использоватьinОператор
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | a_dictionary.has_key('PapayaWhip') | 'PapayaWhip' in a_dictionary |
| ② | a_dictionary.has_key(x) or a_dictionary.has_key(y) | x in a_dictionary or y in a_dictionary |
| ③ | a_dictionary.has_key(x or y) | (x or y) in a_dictionary |
| ④ | a_dictionary.has_key(x + y) | (x + y) in a_dictionary |
| ⑤ | x + a_dictionary.has_key(y) | x + (y in a_dictionary) |
1, самая простая форма.
2, оператор or имеет меньший приоритет, чем оператор in, поэтому здесь не нужно добавлять скобки.
3, с другой стороны, по той же причине приоритет or ниже, чем in, здесь нужно добавить скобки。(Примечание: здесь код полностью отличается от предыдущего.Питон будет сначала интерпретировать x or y, получив результат x (((если x в контексте Бура является истинным) или y。 Затем Python проверяет, является ли этот результат a_(Одна клавиша в словарь.
4, оператор in имеет меньший приоритет, чем оператор +, поэтому эта форма в коде технически не требует скобки, но 2to3 все равно добавляется.
5. Эта форма обязательно должна быть в скобках, потому что in имеет меньший приоритет, чем +。
В Python 2 многие методы словарного класса возвращают значения в виде списков. Наиболее часто используемые методы включают в себя ключи, элементы и значения. В Python 3 все эти методы возвращают значения в виде динамического вида. В некоторых контекстах это изменение не имеет никакого влияния.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | a_dictionary.keys() | list(a_dictionary.keys()) |
| ② | a_dictionary.items() | list(a_dictionary.items()) |
| ③ | a_dictionary.iterkeys() | iter(a_dictionary.keys()) |
| ④ | [i for iin a_dictionary.iterkeys()] | [i for iin a_dictionary.keys()] |
| ⑤ | min(a_dictionary.keys()) | no change |
- Функция list () преобразует возвращенные значения keys () в статический список, и из соображений безопасности 2to3 может ошибаться. Такой код эффективен, но для использования визуализации он неэффективен. Вы должны проверить код после преобразования, чтобы увидеть, нужен ли вам список, и, возможно, визуализация может сделать то же самое.
- Это другой вид преобразования метода {{item}}, {{item}}) в список ◄ 2to3 возвращает значения метода {{values}}, {{item}}.
- В Python 3 больше не поддерживаются iterkeys (((). Если необходимо, используйте iter ((() для преобразования возвращаемого значения keys ((() в итератор.
4, 2to3 может определить, что метод iterkeys () используется в списке, а затем преобразовать его в Python 3 keys () метод () без использования дополнительного iter () для упаковки его возвращаемого значения). Это возможно, потому что вид является итерационным.
5 2to3 также может распознать, что возвращенные значения метода keys (() сразу же передаются другой функции, которая будет проходить всю последовательность, поэтому нет необходимости первоначально преобразовывать возвращенные значения keys (() в список. Наоборот, функция min (() будет с удовольствием проходить по виду. Этот процесс одинаково эффективен для min ((), max ((), sum ((), list ((), tuple ((), set ((), sorted ((), any (() и all (().
С Python 2 по Python 3 некоторые модули стандартной кури были переименованы. Некоторые взаимосвязанные модули также были объединены или реорганизованы, чтобы сделать эту связь более логичной.
- http
В Python 3 несколько связанных HTTP-модулей объединены в отдельный пакет, который называется http。
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | import httplib | import http.client |
| ② | import Cookie | import http.cookies |
| ③ | import cookielib | import http.cookiejar |
| ④ | import BaseHTTPServer <br> import SimpleHTTPServer <br> import CGIHttpServer | import http.server |
Модуль http.client реализует базовую библиотеку, которую можно использовать для запроса HTTP-ресурсов и анализа HTTP-ответов.
Модуль http.cookies предоставляет Python-интерфейс для получения файлов cookie, отправленных через HTTP-header Set-Cookie
Популярные браузеры сохраняют куки на диске в виде файлов, которые могут быть обработаны модулем http.cookiejar.
Модуль http.server реализует базовый HTTP-сервер
- urllib
В Python 2 есть несколько модулей для анализа, кодирования и извлечения URL-адресов, но эти модули переплетаются друг с другом, как мышиная палочка. В Python 3 эти модули реконструируются и объединяются в отдельный пакет, urllib.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | import urllib | import urllib.request <br> urllib.parse,urllib.error |
| ② | import urllib2 | import urllib.request <br> urllib.error |
| ③ | import urlparse | import urllib.parse |
| ④ | import robotparser | import urllib.robotparser |
| ⑤ | from urllib import FancyURLopener <br> from urllib import urlencode | from urllib.request import FancyURLopener <br> from urllib.parse import urlencode |
| ⑥ | from urllib2 import Request <br> from urllib2 import HTTPError | from urllib.request import Request <br> from urllib.error import HTTPError |
Раньше в модуле urllib в Python 2 имелись различные функции, включая urlopen () для извлечения данных, а также полезные для разделения URL-адресов на его составные части - функции splittype () (), splithost () (), и splituser () (). В новом пакете urllib эти функции были организованы более логически. 2to3 будет изменять вызовы этих функций, чтобы адаптироваться к новой схеме наименования.
В Python 3 предыдущие модули urllib2 были объединены в пакет urllib. В то же время, все ваши любимые вещи из urllib2 будут появляться в модулях urllib в Python 3, например, build_opener (), Request object (), HTTPBasicAuthHandler (), и friends ().
Модуль urllib.parse в Python 3 содержит все функции разбора модуля urlparse в Python 2.
Модуль urllib.robotparse анализирует файл robots.txt.
Класс FancyURLopener, который обрабатывает HTTP-перенаправления и другие коды состояния, остается в модуле urllib.request в Python 3. Функция ≠ urlencode ((() была перенесена в urllib.parse.
Объект Request остается в urllib.request, но такие константы, как HTTPError, были перенесены в urllib.error.
Я упоминал, что 2to3 также переписывает ваши функции? Например, если вы импортируете в Python 2 модуль urllib и вызываете urllib.urlopen () для получения данных, то 2to3 одновременно изменяет import и function calls.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | import urllib print urllib.urlopen('http://diveintopython3.org/').read() | import urllib.request, urllib.parse, urllib.error <br> print(urllib.request.urlopen('http://diveintopython3.org/').read()) |
- dbm
Все DBM-клоны теперь в отдельном пакете, dbm. Если вам нужен какой-то конкретный вариант, например GNUDBM, вы можете импортировать соответствующий модуль в пакет dbm.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | import dbm | import dbm.ndbm |
| ② | import gdbm | import dbm.gnu |
| ③ | import dbhash | import dbm.bsd |
| ④ | import dumbdbm | import dbm.dumb |
| ⑤ | import anydbm <br> import whichdb | import dbm |
- xmlrpc
XML-RPC - это легкий метод для выполнения вызовов удаленного RPC через протокол HTTP. Некоторые библиотеки реализаций XML-RPC для клиентов и серверов XML-RPC теперь объединены в отдельные пакеты, xmlrpc.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | import xmlrpclib | import xmlrpc.client |
| ② | import DocXMLRPCServer <br> import SimpleXMLRPCServer | import xmlrpc.server |
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | try:<br> import cStringIO as StringIO <br>except ImportError: <br> import StringIO | import io |
| ② | try:<br> import cPickle as pickle <br>except ImportError: <br> import pickle | import pickle |
| ③ | import _builtin_ | import builtins |
| ④ | import copy_reg | import copyreg |
| ⑤ | import Queue | import queue |
| ⑥ | import SocketServer | import socketserver |
| ⑦ | import ConfigParser | import configparser |
| ⑧ | import repr | import reprlib |
| ⑨ | import commands | import subprocess |
- В Python 2 вы обычно делаете это, сначала пытаясь импортировать cStringIO в качестве замены для StringIO, а если это не удается, то импортируйте StringIO. Не делайте этого в Python 3; модуль io поможет вам справиться с этим. Он найдет самый быстрый способ реализации, который доступен, и будет использовать его автоматически.
- В Python 2 импортировать самую быструю реализацию пиккеля - это тоже очень полезный способ. В Python 3 модуль пиккеля делает это за вас, поэтому не делайте этого больше.
- модуль builtins содержит глобальные функции, классы и константы, которые используются во всем языке Python. Переопределение какой-либо функции в модуле builtins означает переопределение этой глобальной функции повсюду. Это звучит мощно, но в то же время и ужасно.
- модуль copyreg добавляет поддержку модуля pickle для пользовательских типов, определенных в языке C.
5, модуль "queue" реализует многопроизводительскую, многопотребительскую очередь (multi-producer, multi-consumer queue) [2]. - Модуль socketserver предоставляет общие базовые классы для реализации различных сокет-серверов.
7, модуль configparser используется для анализа конфигурационных файлов INI-style.
8, модуль reprlib переосуществляет встроенную функцию repr (() и добавляет контроль над длиной строки, показываемой перед отсечением.
Модуль подпроцесса позволяет создавать подпроцессы, подключаться к их трубопроводам и получать их возвратные значения.
- Относительный вход в пакет
Пакет - это единое целое, состоящее из группы взаимосвязанных модулей. В Python 2 для взаимной ссылки на модули одного и того же пакета вы используете import foo или from foo import Bar. Интерпретатор Python 2 сначала ищетfoo.py в текущем каталоге, а затем ищет в поисковом пути Python ((sys.path). В Python 3 процесс немного отличается.
Предположим, у вас есть несколько файлов в одном каталоге:
chardet/
|
+--init.py
|
+--constants.py
|
+--mbcharsetprober.py
|
+--universaldetector.py
Предположим, что universaldetector.py требует импортировать constants.py, а также требует импортировать класс mbcharsetprober.py. Что бы вы сделали?
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | import constants | from .import constants |
| ② | from mbcharsetprober import MultiByteCharSetProber | from .mbcharsetprober import MultiByteCharsetProber |
Когда вам нужно импортировать целый модуль из другого места в пакете, используйте новую синтаксию from .import. Здесь символ (((.) обозначает относительный путь между текущим файлом (universaldetector.py) и файлом, который вы хотите импортировать (constants.py). В этом примере эти два файла находятся в одной каталоге, поэтому используется один символ. Вы также можете импортировать из родительского каталога (from .. import anothermodule) или из подкаталога.
2. Чтобы импортировать конкретный класс или функцию из других модулей непосредственно в именное пространство вашего модуля, добавьте относительный путь к имени модуля, который требует импорта, и удалите последнюю скобку ((slash)). В этом примере, mbcharsetprober.py находится в одном каталоге с universaldetector.py, поэтому относительный путь называется цифрой. Вы также можете импортировать из родительского каталога ((from .. import anothermodule) или из подкаталога.
В Python 2 итератор имеет метод next () для возвращения следующего элемента в последовательности. В Python 3 это также работает, но теперь есть новая глобальная функция next (), которая использует итератор в качестве параметра.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | anIterator.next() | next(anIterator) |
| ② | a_function_that_returns_an_iterator().next() | next(a_function_that_returns_an_iterator()) |
| ③ | class A:<br> def next(self):<br> pass | class A:<br> def next(self):<br> pass| |
| ④ | class A:<br> def next(self, x, y):<br> pass | no change |
| ⑤ | next = 42<br>for an_iterator in a_sequence_of_iterators:<br> an_iterator.next() | next = 42<br>for an_iterator in a_sequence_of_iterators:<br> an_iterator.next() |
1, самый простой пример, вы больше не вызываете метод next (() для итера, теперь вы передаете сам итера в качестве параметров глобальной функции next (()) [2].
2) Если вы получили функцию, которая возвращает значение, то она должна быть функцией индексатора, вызвать эту функцию и передать результат в качестве параметров функции next ((((скрипт 2to3 достаточно умный, чтобы правильно выполнить это преобразование)))
В-третьих, если вы предположительно определили свой собственный класс, а затем использовали его в качестве итератора, то в Python 3 вы можете определить специальные методы, которые вы можете использовать для определения своего собственного класса.next() для достижения.
Если в классе, который вы определили, есть next () и он использует один или несколько параметров, то при выполнении 2to3 он не будет подвижен. Этот класс не может использоваться в качестве итератора, потому что его метод next () имеет параметры.
5, это немного сложно. Если вы случайно имеете локальную переменную, называемую next, в Python 3 она имеет более высокий приоритет, чем глобальная функция next (((). В этом случае вам нужно вызвать специальные методы итератора__next__() для получения следующего элемента в последовательности。(или, вы также можете перестроить код так, чтобы имя этой локальной переменной не было next, но 2to3 не сделает этого для вас。)
В Python 2 метод filter() возвращает список, полученный с помощью функции, которая возвращает значение True или False для проверки каждого элемента в последовательности. В Python 3 функция filter() возвращает итератор, а не список.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | filter(a_function, a_sequence) | list(filter(a_function, a_sequence)) |
| ② | list(filter(a_function, a_sequence)) | no change |
| ③ | filter(None, a_sequence) | [i for iin a_sequence if i] |
| ④ | for i in filter(None, a_sequence): | no change |
| ⑤ | [i for iin filter(a_function, a_sequence)] | no change |
1, в самом простом случае, 2to3 использует функцию list () для упаковки фильтра () и пересекает ее параметры, а затем возвращает список.
Однако, если вызывание filter() уже упаковано в пакет list(), 2to3 не будет обрабатывать его, так как в этом случае не имеет значения, является ли возвращаемое значение filter() итератором.
Для обработки специфического синтаксиса filter ((None, ...) 2to3 преобразует этот вызов из грамматического эквивалента в список анализа.
4. Поскольку цикл for проходит через всю последовательность, нет необходимости в дальнейших изменениях.
5. Как и выше, не требуется никаких изменений, поскольку анализ списка проходит через всю последовательность, и даже если filter () возвращает итератор, он будет работать так же, как и предыдущий filter () возвращал список.
Как и в случае с filter ((), функция map (() теперь возвращает итератор。(В Python 2 она возвращает список。)
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | map(a_function,'PapayaWhip') | list(map(a_function,'PapayaWhip')) |
| ② | map(None,'PapayaWhip') | list('PapayaWhip') |
| ③ | map(lambda x: x+1,range(42)) | [x+1for x in range(42)] |
| ④ | for i in map(a_function, a_sequence): | no change |
| ⑤ | [i for iin map(a_function,a_sequence)] | no change |
1, аналогично обработке filter ((), в простейшем случае 2to3 использует функцию list (() для упаковки вызова map (().
Для специального синтаксиса map ((None, ...) аналогично filter ((None, ...) 2to3 преобразует его в эквивалентный вызов, использующий list (().
Если первый аргумент map () - это функция lambda, то 2to3 преобразует её в эквивалентный список.
4. Для циклов for, которые проходят через всю последовательность, изменения не требуются.
5. Опять же, здесь нет необходимости в изменениях, так как список будет проходить через всю последовательность, и даже если возвращенное значение map () является итератором, а не списком, оно будет работать нормально.
В Python 3 функция reduce ((() была удалена из глобального пространства имен и теперь помещена в модуль fucntools。
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | reduce(a, b, c) | from functools import reduce reduce(a, b, c) |
В Python 2 есть глобальная функция apply (), которая использует функцию f и список.[a, b, c] возвращает в качестве аргумента значение f ((a, b, c) <unk>. Вы также можете добавить звездочку (() перед списком, вызвав эту функцию напрямую.*В Python 3 функция apply ((() больше не существует; нужно использовать маркировку звездочкой.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | apply(a_function, a_list_of_args) | a_function(*a_list_of_args) |
| ② | apply(a_function, a_list_of_args, a_dictionary_of_named_args) | a_function(*a_list_of_args,**a_dictionary_of_named_args) |
| ③ | apply(a_function, a_list_of_args+ z) | a_function(*a_list_of_args+ z) |
| ④ | apply(aModule.a_function, a_list_of_args) | aModule.a_function(*a_list_of_args) |
1, простейшая форма, которая может быть использована в списке параметров, как[a, b, c]), добавить звездочку, чтобы вызвать функцию。 Это эквивалентно функции apply ((() в Python 2.
В Python 2 функция apply (() может иметь три параметра: функцию, список параметров и словарь именных аргументов. В Python 3 вы можете добавить звездочку (() перед списком параметров.*), добавить две звездочки перед именными параметрами словаря ((*В этом случае мы не сможем достичь того же эффекта.
3, оператор + используется здесь как функция соединения списка, и имеет более высокий приоритет, чем оператор, поэтому нет необходимости добавлять дополнительные скобки вокруг a_list_of_args + z.
4, 2to3 скрипты достаточно умны, чтобы конвертировать сложные призывы apply (), включая призывы к функциям в модуле импорта.
В Python 2 вы можете использовать функцию intern (() для определения её действия на строке, чтобы достичь оптимизации производительности. В Python 3 функция intern (() была перенесена в модуль sys.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | intern(aString) | sys.intern(aString) |
-
Заявление exec
Так же, как в Python 3 print-соглашение превращается в функцию, так и в exec-соглашении. функцию .exec () использует в качестве параметров строку, содержащую любой код Python, и затем выполняет ее, как в случае с исполнением предложения или выражения.
| Notes | Python 2 | Python 3 |
|---|
|①|exec codeString|exec(codeString)
|②|exec codeString in a_global_namespace|exec(codeString, a_global_namespace)|
|③|exec codeString in a_global_namespace, a_local_namespace|exec(codeString, a_global_namespace,a_local_namespace)|
1, в своей простейшей форме, потому что exec (() теперь является функцией, а не выражением, 2to3 окружает этот код в виде строки скобками.
2. В Python 2 exec-заявление может указывать пространство имен, и код будет выполняться в этом частном пространстве, состоящем из глобальных объектов. Так же работает Python 3; вам просто нужно передать это пространство имен в качестве второго параметра функции exec ().
3. Еще более удивительным является то, что в Python 2 в exec-заказе также может быть указано местное пространство имен (например, переменная, объявленная в функции). В Python 3 функция exec () также имеет такую функцию.
В отличие от exec, который использует строки, execfile использует файлы. В Python 3, execfile был удален. Если вы действительно хотите выполнить код Python в файле, но вы не хотите импортировать его, вы можете открыть его, прочитать его содержимое, а затем вызвать функцию compile (всемирная функция), чтобы заставить интерпретатор Python компилировать код, а затем вызвать новую функцию exec (всемирная функция).
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | execfile('a_filename') | exec(compile(open('a_filename').read(),'a_filename','exec')) |
В Python 2 для получения произвольного объекта в строке есть способ упаковать объект в обратную ссылку ((, напримерxВ Python 3 эта способность сохранилась, но вы больше не можете использовать обратную ссылку для получения этой строки. Вам нужно использовать глобальную функцию repr ((() }}.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | `x` | repr(x) |
| ② | `'PapayaWhip' + `2`` | repr('PapayaWhip'+ repr(2)) |
- Помните, что x может быть чем угодно: классом, функцией, модулем, базовым типом данных и т. д.
2, в Python 2 обратная ссылка может быть встроена, что приводит к этому запутанному (но эффективному) выражению . 2to3 достаточно умны, чтобы преобразовать этот встроенный вызов в функцию .
С Python 2 в Python 3 немного изменился синтаксис, используемый для захвата аномалий.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | try:<br> import mymodule<br>except ImportError, e<br> pass | try:<br> import mymodule<br>except ImportError as e:<br> pass |
| ② | try:<br> import mymodule<br>except (RuntimeError, ImportError), e<br> pass | try:<br> import mymodule<br>except (RuntimeError, ImportError) as e:<br> pass |
| ③ | try:<br> import mymodule<br>except ImportError:<br> pass | no change |
| ④ | try:<br> import mymodule<br>except:<br> pass | no change |
1, по сравнению с добавлением запятой после необычного типа в Python 2, Python 3 использует новый ключевой словарь, as。
2. Ключевое слово as также может быть использовано при одновременном обнаружении нескольких типов аномалий.
Если вы поймали исключение, но не обращали внимания на сам объект исключения, то синтаксис Python 2 и Python 3 одинаковый.
4 , Аналогично, если вы используете метод страховки ((fallback) для захвата всех исключений, синтаксис Python 2 и Python 3 одинаковый.
5. При импорте модулей (или в большинстве других случаев) вам абсолютно не следует использовать этот метод (см. вышеупомянутый фаллбэк). В противном случае программа может поймать такие исключения, как KeyboardInterrupt (если пользователь прервет программу, нажав Ctrl-C), что затрудняет дебютирование.
В Python 3 существуют небольшие изменения в синтаксисе, позволяющих выбрасывать пользовательские исключения.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | raise MyException | unchanged |
| ② | raise MyException,'error message' | raise MyException('error message') |
| ③ | raise MyException,'error message', a_traceback | raise MyException('errormessage').with_traceback(a_traceback) |
| ④ | raise 'error message' | unsupported |
- исключить исключения, не содержащие пользовательских ошибочных сообщений, при этом в простейшей форме грамматика не изменяется;
- Изменение становится очевидным, когда вы хотите выбросить исключение с пользовательскими ошибочными сообщениями. Python 2 использует запятую для разделения исключений и ошибок; Python 3 передает ошибки в качестве параметров к исключениям.
- Python 2 поддерживает более сложный синтаксис, чтобы выбрасывать исключения с пользовательским отслеживанием. В Python 3 вы можете сделать это, но в совершенно ином синтаксисе.
4 В Python 2 вы можете выбрасывать исключение без исключительного класса, имея только одну исключительную информацию. В Python 3 эта форма больше не поддерживается. 2to3 предупредит вас, что он не может автоматически исправить этот синтаксис.
В Python 2 в генераторе есть метод throw (). вызов a_generator.throw () выводит исключение, когда генератор приостанавливается, а затем возвращает следующее значение, полученное функцией генератора. В Python 3 эта функция все еще доступна, но немного по-другому в синтаксическом плане.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | a_generator.throw(MyException) | no change |
| ② | a_generator.throw(MyException,'error message') | a_generator.throw(MyException('error message')) |
| ③ | a_generator.throw('error message') | unsupported |
- в простейшей форме генератор выводит исключения без пользовательских ошибочных сообщений. В этом случае нет изменений в синтаксисе от Python 2 до Python 3.
- Если генератор выбросит исключение с пользовательским ошибочным сообщением, вам нужно передать этот ошибочный сигнал в строку ((error string) к классу исключений, чтобы инстанционировать его.
3 , Python 2 также поддерживает исключения, в которых выделяется только информация об исключениях. Python 3 не поддерживает такой синтаксис, и 2to3 отображает предупредительное сообщение, говорящее вам, что вам нужно вручную исправить этот код.
В Python 2 есть два способа получить число в пределах определенного диапазона: range (), который возвращает список, и range (), который возвращает итератор. В Python 3 range (), возвращающий итератор, и xrange (), который больше не существует.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | xrange(10) | range(10) |
| ② | a_list = range(10) | a_list = list(range(10)) |
| ③ | [i for iin xrange(10)] | [i for iin range(10)] |
| ④ | for i in range(10): | no change |
| ⑤ | sum(range(10)) | no change |
1, в самом простом случае 2to3 просто преобразует xrange () в range () [2].
2, если в вашем коде Python 2 используется range (), 2to3 не знает, нужен ли вам список, или же работает итератор. В качестве меры предосторожности 2to3 может ошибиться и использовать list (), чтобы принудительно преобразовать возвращаемое значение range ().
Если в списке есть функция xrange (), то нет необходимости преобразовывать ее в список, поскольку списочный анализ действует так же, как и для итератора.
4 , аналогично, цикл for может также действовать на итераторы, так что здесь ничего не меняется.
Функция sum ((() действует на итератор, поэтому 2to3 здесь не изменяется. Так же, как вернется значение как вид ((view), а не как список, это также применимо к min (((), max (((), sum (((), list (((), tuple (((), set (((), sorted (((), any (((), all ((().
В Python 2 есть две глобальные функции, которые используются для запроса пользователя на вводе в командной строке. Первая называется input(), которая ждет, пока пользователь введет Python-выражение (((, а затем вернет результат). Вторая называется raw_input (((), и то, что пользователь вводит, то и возвращает.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | raw_input() | input() |
| ② | raw_input('prompt') | input('prompt') |
| ③ | input() | eval(input()) |
1, в простейшей форме, raw_input (() заменен на input (()) [2].
2, в Python 2 функция raw_input (() может задавать указатель в качестве параметра. Эта функция сохранена в Python 3.
3, если вы действительно хотите попросить пользователя ввести Python-выражение и рассчитать результат, вы можете вызвать функцию input() и передать возвращаемое значение eval()。
В Python 2 код функции может получить доступ к специальным свойствам самой функции. В Python 3 эти специальные свойства были переименованы для согласованности.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | a_function.func_name | a_function._name_ |
| ② | a_function.func_doc | a_function._doc_ |
| ③ | a_function.func_defaults | a_function._defaults_ |
| ④ | a_function.func_dict | a_function._dict_ |
| ⑤ | a_function.func_closure | a_function._closure_ |
| ⑥ | a_function.func_globals | a_function._globals_ |
| ⑦ | a_function.func_code | a_function._code_ |
1、name атрибут ((originalfunc_name) содержит имя функции。
2、doc атрибут ((originalfuncdoc) содержит строку документа, которую вы определили в исходном коде функции ((docstring))
3、defaults атрибут ((originalfunc_defaults) - это матрица, хранящая параметры по умолчанию.
4、dict атрибут ((originalfunc_dict) - пространство имен, поддерживающее произвольные атрибуты функций.
5、__closure__attribute ((originalfunc_closure) - это подгруппа, состоящая из объектов cell, которая содержит связь функции со свободной переменной ((free variable)).
6、globals атрибут ((originalfunc_globals) - это ссылка на модуль глобального именного пространства, в котором сама функция определена.
7、code атрибут ((originalfunc_code) - это объект кода, который представляет собой компилированное функциональное тело.
В Python 2 файловые объекты имеют метод xreadlines (), который возвращает итератор, который зачитывает одну строку файла за раз. Это особенно полезно в цикле for. Фактически, более поздние версии Python 2 добавляют такую функцию к самим файловым объектам.
В Python 3 метод xreadlines () больше не используется. 2to3 может решить простые ситуации, но некоторые крайние случаи требуют ручного вмешательства.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | for line in a_file.xreadlines(): | for line in a_file: |
| ② | for line in a_file.xreadlines(5): | no change (broken) |
1, если вы ранее вызвали xreadlines, не содержащие параметров ((), 2to3 преобразует его в сам объект файла. В Python 3 после такого преобразования код может выполнять ту же работу, что и раньше: зачитывает одну строку файла, а затем выполняет циклическое тело for.
2, если вы ранее использовали аргумент ((количество строк при каждом прочтении) для вызова xreadlines ((), 2to3 не сможет завершить переход из Python 2 в Python 3, ваш код будет проваливаться таким образом: AttributeError: '_io.TextIOWrapper' object has no attribute 'xreadlines'. Вы можете вручную изменить xreadlines на readlines, чтобы код работал в Python 3.
В Python 2 вы можете определить анонимную функцию lambda, которая фактически может принимать несколько параметров, указав число элементов в качестве элемента. Фактически, интерпретатор Python 2 расшифровывает этот элемент в именные аргументы, которые вы можете затем использовать в функции lambda. В Python 3 вы все еще можете передать элемент в качестве параметра функции lambda, но интерпретатор Python не будет анализировать его в именные параметры.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | lambda (x,): x+ f(x) | lambda x1: x1[0]+f(x1[0]) |
| ② | lambda (x, y): x+f(y) | lambda x_y: x_y[0]+f(x_y[1]) |
| ③ | lambda (x,(y,z)): x+ y+ z | lambda x_y_z: x_y_z[0]+x_y_z[1][0]+ x_y_z[1][1] |
| ④ | lambda x, y, z: x+y + z | unchanged |
1, если вы уже определили функцию lambda, которая использует в качестве аргумента элемент, содержащий элемент, в Python 3 она будет преобразована в элемент, содержащий x1[Функция lambda, ссылающаяся на 0], ≠ x1, автоматически генерируется в скрипте 2to3 на основе именных параметров в исходном матрице.
Функция lambda с двумя элементами (x, y) в качестве параметров преобразуется в функцию x_y, которая имеет два параметра положения: x_y[0] и x_y[1]。
Скрипты 2 к 3 могут даже обрабатывать lambda-функции с использованием матрицы с именными параметрами в качестве параметров. Результатный код будет немного сложным для чтения, но он будет работать в Python 3 так же, как и исходный код в Python 2.
4. Вы можете определить функцию lambda с несколькими параметрами. Если параметры не окружены скобками, Python 2 будет рассматривать ее как функцию lambda с несколькими параметрами; в этом корпусе lambda вы будете ссылаться на эти параметры по имени, как и в других типах функций.
В Python 2 методы класса могут получить доступ к объекту, который определяет их класс (class object), а также к самому объекту метода (method object). im_self - это объект-импликация класса; im_func - это объект-функция, а im_class - сам класс. В Python 3 эти свойства были переименованы, чтобы следовать конвенциям имен других свойств.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | aClassInstance.aClassMethod.im_func | aClassInstance.aClassMethod._func_ |
| ② | aClassInstance.aClassMethod.im_self | aClassInstance.aClassMethod._self_ |
| ③ | aClassInstance.aClassMethod.im_class | aClassInstance.aClassMethod._self_._class_ |
В Python 2 вы можете создавать свои собственные классы и использовать их в boolean context. Например, вы можете инстанцировать этот класс и использовать этот экземпляр в if-заявлении.nonzero() метод, который возвращает значение True или False, и который вызывается, когда объект экземпляра находится в контексте на буле. В Python 3 вы все еще можете выполнять ту же функцию, но название этого специального метода становится__bool__()。
| Notes | Python 2 | Python 3 |
|---|
|①|class A:<br> def nonzero(self):<br> pass|class A:<br> def bool(self):<br> pass
|②|class A:<br> def nonzero(self, x, y):<br> pass|no change|
- Python 3 вызывает объект класса, используемый в контексте на BULL__bool__(), а не__nonzero__()。
2, однако, если вы определили, что использует два параметра__nonzero__() метод, 2to3 скрипт предполагает, что вы определили этот метод для других целей, и поэтому не изменяет код.
Между Python 2 и Python 3 существует небольшое изменение в грамматике определения восьмизначных (октальных) чисел.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | x = 0755 | x = 0o755 |
Поскольку длинные и целостные типы были объединены, константа sys.maxint перестала быть точной. Но поскольку это значение было полезно для определения возможностей конкретной платформы, оно было сохранено в Python 3 и было переименовано в sys.maxsize.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | from sys importmaxint | from sys importmaxsize |
| ② | a_function(sys.maxint) | a_function(sys.maxsize) |
1, maxint превращается в maxsize.
2, все sys.maxint превратились в sys.maxsize。
В Python 2 вы можете использовать глобальную функцию callable ((() для проверки того, может ли объект быть вызван как ((callable, например функция)). В Python 3 эта глобальная функция была отменена. Для проверки того, может ли объект быть вызван, можно проверить специальные методы__call_Существование ______
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | callable(anything) | hasattr(anything,'_call_') |
В Python 2 глобальная функция zip() может использовать в качестве параметров любые последовательности, она возвращает список, состоящий из множественных элементов. Первая множественная группа содержит первый элемент каждой последовательности; вторая множественная группа содержит второй элемент каждой последовательности; последовательно передается вниз. В Python 3 zip() возвращает итератор, а не список.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | zip(a, b, c) | list(zip(a, b, c)) |
| ② | d.join(zip(a, b, c)) | no change |
В простейшей форме, вы можете восстановить предыдущую функцию функции, вызвав функцию list (), которая упаковывает zip (), перемещаясь по итератору, который возвращает функцию list (), и возвращая список результатов.
В контекстах, где все элементы последовательности уже пересекаются (например, при использовании метода join), итераторы, возвращающие zip, работают нормально. Сценарий 2to3 обнаруживает эти случаи и не изменяет ваш код.
В Python 2 StandardError является базовым классом для всех других встроенных исключений, кроме StopIteration, GeneratorExit, KeyboardInterrupt, SystemExit. В Python 3 StandardError уже отменен; заменяется использованием Exception.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | x =StandardError() | x =Exception() |
| ② | x =StandardError(a, b, c) | x =Exception(a, b, c) |
Различные константы в модуле types помогают вам определить тип объекта. В Python 2 он содержит константы, которые представляют собой все основные типы данных, такие как dict и int. В Python 3 эти константы уже отменены.
| Notes | Python 2 | Python 3 |
|---|---|---|
| types.UnicodeType | str | |
| types.StringType | bytes | |
| types.DictType | dict | |
| types.IntType | int | |
| types.LongType | int | |
| types.ListType | list | |
| types.NoneType | type(None) | |
| types.BooleanType | bool | |
| types.BufferType | memoryview | |
| types.ClassType | type | |
| types.ComplexType | complex | |
| types.EllipsisType | type(Ellipsis) | |
| types.FloatType | float | |
| types.ObjectType | object | |
| types.NotImplementedType | type(NotImplemented) | |
| types.SliceType | slice | |
| types.TupleType | tuple | |
| types.TypeType | type | |
| types.XRangeType | range |
types.StringType отображается как байты, а не как string, потому что в Python 2 string - это, по сути, последовательность байтов, закодированных каким-то образом.
isinstance() - функция, которая проверяет, является ли объект экземпляром определенного класса (class) или типа (type). В Python 2 вы можете передать модуль, состоящий из типов (types), в instance (), и если объект относится к любому типу модуля, функция возвращает True. В Python 3 вы можете это сделать, но не рекомендуется использовать один тип для повторного передачи в качестве аргумента.
| Notes | Python 2 | Python 3 |
|---|---|---|
| isinstance(x,(int,float,int)) | isinstance(x,(int,float)) |
В Python 2 существует два типа стрингов: Unicode-кодированные и не-уникодированные. Однако существует еще один тип - basestring. Это абстрактный тип данных, который является суперклассом str и unicode.
| Notes | Python 2 | Python 3 |
|---|---|---|
| isinstance(x, basestring) | isinstance(x, str) |
Python 2.3 вводит модуль itertools, который определяет варианты () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () ()
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | itertools.izip(a, b) | zip(a, b) |
| ② | itertools.imap(a, b) | map(a, b) |
| ③ | itertools.ifilter(a, b) | filter(a, b) |
| ④ | from itertools import imap, izip, foo | from itertools import foo |
- Используйте глобальную функцию zip (), а не itertools.izip ().
- Используйте map (), а не itertools.imap ().
3 ,itertools.ifilter() превратился в filter() 。 - Модуль itertools сохранился в Python 3, но он больше не содержит функций, которые были перенесены в глобальное пространство имен. Сценарий 2to3 может быть достаточно умным, чтобы удалить несуществующие импортируемые предложения, сохраняя целостность других импортируемых предложений.
При обработке исключений в модуле sys есть три переменных, к которым вы можете получить доступ: sys.exc_type, sys.exc_value, sys.exc_traceback. (Фактически, эти переменные уже существовали во времена Python 1). Начиная с Python 1.5, в связи с новой версией sys.exc_info, использование этих трех переменных больше не рекомендуется, это метагруппа, содержащая все три элемента. В Python 3 эти три переменные, наконец, больше не существуют; это означает, что вы должны использовать sys.exc_info.
| Notes | Python 2 | Python 3 |
|---|---|---|
| sys.exc_type | sys.exc_info()[0] | |
| sys.exc_value | sys.exc_info()[1] | |
| sys.exc_traceback | sys.exc_info()[2] |
В Python 2, если вам нужно написать перечисление в пересекающемся элемента, вам не нужно добавлять скобки вокруг значения элемента. В Python 3, эти скобки обязательны.
| Notes | Python 2 | Python 3 |
|---|---|---|
| [i for iin 1,2] | [i for iin(1,2)] |
В Python 2 есть функция os.getcwd(), которая возвращает текущий рабочий каталог как строку ((неуникодированную)). Поскольку современные файловые системы могут обрабатывать имена каталогов, кодируемые геометрическими символами, Python 2.3 вводит функцию os.getcwdu ((().
| Notes | Python 2 | Python 3 |
|---|---|---|
| os.getcwdu() | os.getcwd() |
В Python 2 вы можете определить параметры метакласса в заявлении класса или определить специальный уровень класса (class-level)metaclass атрибуты для создания подклассов.__metaclass_Атрибут _ был удален.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | class C(metaclass=PapayaMeta):<br> pass | unchanged |
| ② | class Whip:<br> _metaclass_ = PapayaMeta | class Whip(metaclass=PapayaMeta):<br> pass |
| ③ | class C(Whipper, Beater):<br> _metaclass_ = PapayaMeta | class C(Whipper,Beater,metaclass=PapayaMeta):<br> pass |
- объявление параметров метакласса при объявлении класса, это работает в Python 2 и Python 3, они одинаковы <unk>
- В определении класса объявляется, что свойство metaclass действует в Python 2, но больше не действует в Python 3.
3, 2to3 - способность создавать декларацию класса, которая действительна, даже если класс наследует от нескольких родительских классов.
Ниже перечисленные исправления не являются настоящими исправлениями. То есть, они являются лишь стилистическими изменениями кода, не касающимися сути кода. Но разработчики Python очень заинтересованы в том, чтобы стиль кода был максимально согласованным. Для этого существует специальное официальное руководство о стиле кода Python.
-
set{} буквальное значение
В Python 2 единственный способ определить совокупность буквенных значений ((literal set) - это вызвать set ((a_sequence)). В Python 3 это все еще работает, но использование нового обозначения ((literal notation): большие скобки (({}) является более четким способом. Этот метод работает помимо пустых наборов, так как словаря также обозначают их большими скобками, поэтому {} обозначает пустой словарь, а не пустой набор.
2to3 скрипт по умолчанию не исправляет set ((() буквальное значение. Чтобы включить эту функцию, в командной строке при вызове 2to3 укажите -f set_literal параметр.
| Notes | Before | After |
|---|---|---|
| set([1,2,3]) | {1,2,3} | |
| set((1,2,3)) | {1,2,3} | |
| set([i for iin a_sequence]) | {i for iin a_sequence} |
-
Глобальный функциональный буфер
Python-объекты, реализованные в C, могут экспортировать буферный интерфейс, который позволяет другим Python-кодам напрямую читать и писать в память. Это звучит очень мощно, но это также ужасно. В Python 3 буфер был переименован в memoryview. Фактические изменения были более сложными, но вы можете почти игнорировать эти различия.
2to3 скрипт по умолчанию не исправляет функцию buffer (((). Чтобы включить эту функцию, в командной строке при вызове 2to3 укажите -f buffer параметр.
| Notes | Before | After |
|---|---|---|
| x =buffer(y) | x =memoryview(y) |
-
Пространство вокруг запятой (открыто)
Несмотря на строгие требования Python к пробелам, используемым для вставки и выставления (indenting and outdenting), Python по-прежнему свободен в использовании пробелов в других аспектах. В списках, подгруппах, наборах и словарях пробелы могут появляться перед или за запятой, что не будет иметь никакого плохого влияния. Однако, в руководстве по стилю кода Python указано, что запятая не может быть пробелом, а запятая должна содержать пробел.
2to3 скрипт по умолчанию не исправляет пробелы вокруг запятой. Для того, чтобы включить эту функцию, в командной строке при вызове 2to3 укажите -f wscomma параметр.
| Notes | Before | After |
|---|---|---|
| a ,b | a, b | |
| {a :b} | {a: b} |
-
Обычные идиомы
В сообществе Python было создано множество обычаев. Есть такие, как while 1: loop, который восходит к Python 1. Python не имел настоящих булевых типов до Python 2.3, поэтому разработчики раньше использовали замены 1 и 0. Современные программисты Python должны тренировать свой мозг, чтобы использовать современные версии этих обычаев.
2to3 скрипт по умолчанию не исправляет эти процедуры. Чтобы включить эту функцию, укажите параметр -f idioms при вызове командной строки 2to3.
| Notes | Before | After |
|---|---|---|
| while 1:<br> do_stuff() | while True:<br> do_stuff() | |
| type(x) == T | isinstance(x, T) | |
| type(x) is T | isinstance(x, T) | |
| a_list = list(a_sequence) | a_list = sorted(a_sequence) | |
| a_list.sort() | do_stuff(a_list) | |
| do_stuff(a_list) |
Смотреть онлайнБлог CSDN
Как преобразовать код Python 2 в код Python 3
О том, как перевести код Python 2.x в код Python 3.x.
Как преобразовать код Python 2.x в код Python 3.x
Этого не так много, если речь идет только о небольшом количестве функций, таких как print и др.
Если вы хотите, я могу изменить код, и я сделаю это.
Версии Python 2.x, такие как Python 2.7.2, который я установил, после загрузки и установки в Windows, содержат некоторые полезные инструменты.
Один из них называется 2to3.py, и он помогает вам реализовать, преобразовать код Python 2.x в код Python 3.x.
Расположен в: Корневой каталог установки Python\Python27\Tools\Scripts\2to3.py
Как использовать 2to3.py, чтобы реализовать код Python 2.x, чтобы преобразовать Python 3.x в код Python
Например, у меня есть сценарий Python 2.x:
D:\tmp\tmp_dev_root\python\python2_to_python3\34563264_data_from_site.py
Теперь кода, который мы хотим преобразовать в Python 3.x.
Можно открыть cmd в windows, перейти к скрипту, который нужно преобразовать, и запустить
D:\tmp\WordPress\DevRoot\Python27\Tools\Scripts\2to3.py -w 34563264_data_from_site.py
В результате успешного преобразования:
D:\tmp\tmp_dev_root\python\python2_to_python3>D:\tmp\WordPress\DevRoot\Python27\Tools\Scripts\2to3.py -w 34563264_data_from_site.py
RefactoringTool: Skipping implicit fixer: buffer
RefactoringTool: Skipping implicit fixer: idioms
RefactoringTool: Skipping implicit fixer: set_literal
RefactoringTool: Skipping implicit fixer: ws_comma
RefactoringTool: Refactored 34563264_data_from_site.py
--- 34563264_data_from_site.py (original)
+++ 34563264_data_from_site.py (refactored)
@@ -18,7 +18,7 @@
import time;
import codecs;
import logging;
-import urllib;
+import urllib.request, urllib.parse, urllib.error;
from datetime import datetime,timedelta;
from optparse import OptionParser;
from string import Template,replace;
@@ -90,7 +90,7 @@
foundPhone = eachItemSoup.find(attrs={"class":"phone"});
logging.debug("foundPhone=%s", foundPhone);
if(foundPhone):
- foundPhoneUni = unicode(foundPhone);
+ foundPhoneUni = str(foundPhone);
logging.debug("foundPhoneUni=%s", foundPhoneUni);
# case 1:
#<p class="phone"><strong>phone:</strong> 800.206.7886<br />
@@ -122,7 +122,7 @@
foundWeb = eachItemSoup.find(attrs={"class":"web"});
logging.debug("foundWeb=%s", foundWeb);
if(foundWeb):
- foundWebUni = unicode(foundWeb);
+ foundWebUni = str(foundWeb);
logging.debug("foundWebUni=%s", foundWebUni);
# <p class="web"><strong>e-mail:</strong> <a href="#">[email protected]</a><br />
@@ -151,7 +151,7 @@
foundAddr = eachItemSoup.find(attrs={"class":"addr"});
logging.debug("foundAddr=%s", foundAddr);
if(foundAddr):
- foundAddrUni = unicode(foundAddr);
+ foundAddrUni = str(foundAddr);
# <p class="addr">
# <strong>address:</strong> 740 SW 21st Ave, Suite #310<br />
RefactoringTool: Files that were modified:
RefactoringTool: 34563264_data_from_site.py
Теперь вы можете видеть, что 34563264_data_from_site.py превратился в код Python 3.x.
Для сравнения можно выделить следующий файл: bak:34563264_data_from_site.py.bak
В настоящее время для самого 2to3.py можно найти дополнительные варианты использования в поиске в help:
D:\tmp\tmp_dev_root\python\python2_to_python3>D:\tmp\WordPress\DevRoot\Python27\Tools\Scripts\2to3.py -h
Usage: 2to3 [options] file|dir ...
Options:
-h, --help show this help message and exit
-d, --doctests_only Fix up doctests only
-f FIX, --fix=FIX Each FIX specifies a transformation; default: all
-j PROCESSES, --processes=PROCESSES
Run 2to3 concurrently
-x NOFIX, --nofix=NOFIX
Prevent a transformation from being run
-l, --list-fixes List available transformations
-p, --print-function Modify the grammar so that print() is a function
-v, --verbose More verbose logging
--no-diffs Don't show diffs of the refactoring
-w, --write Write back modified files
-n, --nobackups Don't write backups for modified files
В этой статье я объясняю это следующим образом:
(1) Если вышеупомянутый параметр -w не используется, то по умолчанию в текущем окне печатается только содержание diff, соответствующее процессу преобразования.
(2) Добавить -w означает переписать измененное в исходном документе.
(3) Если вы не хотите создавать файл "bak", добавьте -n.
(4) Если вы не хотите видеть эту кучу выводов, добавьте но-диффы.
Остальное - не так уж и много. Заинтересованные могут самостоятельно продолжать искать.
Примечание:На пути
Если есть ошибки, пожалуйста, укажите! ^_^

