Изменения в Python 2.x.x и Python 3.x.x & как преобразовать Python 2.x.x в Python 3.x.x

Автор:Маленькие мечты, Создано: 2016-10-09 12:36:49, Обновлено: 2017-10-11 10:18:05

Python 2 и Python 3 различают и изменяют грамматику

Практически все программы Python 2 требуют некоторых изменений, чтобы нормально работать в среде Python 3. Для упрощения этого процесса, Python 3 содержит утилитный скрипт под названием 2to3, который принимает ваши исходные файлы Python 2 в качестве ввода, а затем автоматически преобразует их в формы Python 3.

  • print-заявление

В Python 2 print - это заявление. Все, что вы хотите вывести, можно поставить за ключевым словом print. В Python 3 print ()) - это функция. Как и в других функциях, print ()) требует, чтобы вы передали ей то, что вы хотите вывести в качестве параметра.

Примечания Python 2 Python 3
печать печатать))
печать 1 печать ((1)
1,2 печать печать ((1,2)
напечатать 1, 2, print ((1,2,end= ")
Напечатать >>sys.stderr,1,2,3 print ((1,2,3, файл=sys.stderr)

1, для вывода пустой строки необходимо вызвать print без параметров ((() ). 2, для вывода отдельного значения необходимо использовать это значение как один из параметров print (). 3, для вывода используются два значения, разделенных одним пространством, и можно вызвать два параметра print (((). В этом примере есть несколько хитростей. В Python 2 если вы используете запятую ((,) в конце предложения print, то она будет выводить результаты, разделенные на пробелы, а затем выводить следующее пространство (trailing space) без вывода кареты (carriage return). В Python 3 такой же эффект может быть достигнут, если передать print (print) параметр end = как ключевое слово. В Python 2 вы можете перенаправить вывод на канал, например, sys.stderr, используя синтаксис >pipe_name. В Python 3 вы можете сделать то же самое, передав print))) в качестве значения ключевого слова параметровой файл.

  • Unicode строки

В Python 2 существует два типа строк:Unicode строкииНеуникодные строки⇒ Python 3 имеет только один тип:Unicode strings (Страны Unicode)

Примечания Python 2 Python 3
Папайя Папайя
Папайя Папайя Вип\foo

Строки Unicode в Python 2 являются обычными строками в Python 3, поскольку в Python 3 строки всегда имеют форму Unicode. Unicode raw string ("при использовании этой строки Python не будет автоматически преобразовывать обратную ссылку") также заменяется обычной строкой, поскольку в Python 3 все первичные строки закодированы в Unicode.

  • Глобальная функция Unicode ((()

В Python 2 есть две глобальные функции, которые могут принудительно преобразовывать объекты в строки: unicode ((() преобразовывает объекты в Unicode, а также str ((() преобразовывает объекты в не-Unicode. В Python 3 есть только один тип строки, Unicode String, поэтому str ((() функция может выполнять все функции.Функция unicode (()) больше не существует в Python 3.)

Примечания Python 2 Python 3
Юникод ((что угодно) Ничего.
  • длинный целый

В Python 2 имеются типы int и long, предназначенные для неплавающих точек. Максимальное значение типа int не может превышать sys.maxint, и это максимальное значение имеет отношение к платформе. Можно определить длинные целые типы, добавив L к концу числа, и, очевидно, он имеет более широкий диапазон цифр, чем тип int. В Python 3 есть только один тип целого числа int, который в большинстве случаев похож на длинные целые типы в Python 2. Поскольку уже не существует двух типов целых, нет необходимости использовать специальную грамматику, чтобы отличить их.

Читать далее: PEP 237: унифицировать длинные и цельные формы.

Примечания Python 2 Python 3
x = 1000000000000L x = 1000000000000
x = 0xFFFFFFFFFFFF x = 0xFFFFFFFFFF
длинный ((x) int ((x)
тип ((x) длинный тип ((x) - это int
isinstance ((x,long) isinstance ((x,int)

В Python 2 удлинение десятичных целых в Python 3 заменяется удлинением десятичных простых целых. В Python 2 шестнадцатизначные длинные целые числа заменены на шестнадцатизначные простые целые числа в Python 3. В Python 3 у нас нет длинных цепочек, поэтому мы не можем их использовать.Природная функция long ((() также отсутствует. Для принудительного преобразования переменной в целый тип можно использовать функцию int ((().Я не знаю. Проверяет, является ли переменная целым типом, получает ее тип данных и сравнивает с типом int ((не длинный)). Вы также можете проверить тип данных с помощью функции istance ((); еще раз подчеркнем, что для проверки типа целых чисел используется int, а не long.

  • Операторы сравнения <>

Python 2 поддерживает <> как синоним!=. Python 3 поддерживает только!=, больше не поддерживает <>.

Примечания Python 2 Python 3
если x <> y: если x!= y:
если x <> y<> z: если x!= y!= z:

1, просто сравнить. 2, сравнение трех относительно сложных значений.

  • Метод класса словаря has_key)))

В Python 2 метод has_key (), используемый для проверки того, есть ли в словаре конкретный ключ (), больше не поддерживается в Python 3.вОператоры.

Примечания Python 2 Python 3
a_dictionary.has_key ((PapayaWhip) PapayaWhip в словаре
a_dictionary.has_key ((x) или a_dictionary.has_key ((y)) x в a_dictionary или y в a_dictionary
a_dictionary.has_key ((x или y) (x или y) в a_dictionary
a_dictionary.has_key ((x + y) (x + y) в a_dictionary
x + a_dictionary.has_key ((y)) x + (y в a_dictionary)

1, самая простая форма. 2, значение or имеет меньший приоритет, чем значение in, поэтому здесь нет необходимости добавлять скобки. 3, с другой стороны, по той же причине, что приоритетность or ниже, чем in, здесь необходимо добавить скобки. Забота: код здесь совершенно отличается от предыдущей строки. Python сначала интерпретирует x or y, получая результат x (если x в контексте бура является истинным) или y. Затем Python проверяет, является ли этот результат ключом a_dictionary). 4 ∈ ∈ ∈ ∈ ∈ ∈ ∈ ∈ ∈ ∈ ∈ ∈ ∈ ∈ ∈ ∈ ∈ ∈ ∈ 5 ∞, эта форма обязательно требует скоб, так как приоритет in ниже +∞.

  • Метод класса словаря для возвращения списка

В Python 2 многие методы класса словарей возвращают значения в виде списков; наиболее распространенными из них являются ключи, элементы и значения; в Python 3 возвращаются значения всех методов в динамический вид; в некоторых контекстуальных условиях это не влияет. Если возвращаемые значения этих методов сразу же передаются другой функции, и эта функция проходит по всей последовательности, то возвращаемые значения этих методов в виде списков или видов ничего не меняют.

Примечания Python 2 Python 3
a_dictionary.keys ((() список ((a_dictionary.keys())
a_dictionary.items (() список ((a_dictionary.items())
a_dictionary.iterkeys() iter ((a_dictionary.keys())
[i для iin a_dictionary.iterkeys() ] [i для iin a_dictionary.keys() ]
min(a_dictionary.keys()) Нет изменений.

Функция 1, использующая list ((() преобразует возвращенное значение keys ((() в статический список, из соображений безопасности 2to3 может возвращать ошибки. Такой код действенен, но для использования представления он менее эффективен. Вы должны проверить код после преобразования, чтобы увидеть, не обязательно ли вам нужен список, и, возможно, представление может сделать то же самое. 2, это еще один вид перехода к списку методов (относительно элементов) 2to3 для вернуть значения. 3, Пытон 3 больше не поддерживает iterkeys ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((()))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) 4, 2to3 способен распознать, что методы итерkeys (,) используются в анализе списка, а затем преобразовывать их в keys (,) в Python 3. 5, 2to3 также может распознать, что возвращенное значение метода keys (() сразу же передается другому функцию, которая будет проходить через всю последовательность, поэтому не нужно сначала преобразовывать возвращенное значение keys (() в список. Напротив, min (()) будет рад проходить через вид. Этот процесс также работает для min ((), max ((), sum ((), tuple ((), setlist ((), sorted ((), any (() и all (()).

  • Модули, переименованные или реорганизованные

Из Python 2 в Python 3 некоторые модули стандартной библиотеки были переименованы. Некоторые взаимосвязанные модули также были объединены или реорганизованы, чтобы сделать эту связь более логичной.

  • http В Python 3 несколько связанных модулей HTTP объединены в отдельный пакет.
Примечания Python 2 Python 3
Импорт httplib Импорт http.client
Импорт печенье импортировать http.cookies
импортировать cookielib Импорт http.cookiejar
Импорт BaseHTTPServer
Импорт SimpleHTTPServer
Импорт CGIHttpServer
Импорт http.server

Модуль http.client реализует базовую библиотеку, которая может быть использована для запросов на ресурсы HTTP и анализа HTTP-ответов. Модуль http.cookies предоставляет хитроумный (Pythonic) интерфейс для получения файлов cookie, отправленных через HTTP-головной (HTTP header) Set-Cookie Обычные популярные браузеры хранят файлы cookie на диске, которыми управляет модуль http.cookiejar. Модуль http.server реализует базовый HTTP-сервер

  • urllib В Python 2 есть несколько модулей, которые используются для анализа, кодирования и получения URL-адресов, но они накладываются друг на друга, как мышиные клыки. В Python 3 эти модули перестраиваются и объединяются в отдельный пакет, urllib.
Примечания Python 2 Python 3
import urllib Импорт urllib.request
urllib.parse,urllib.error
импортировать urllib2 Импорт urllib.request
urllib.error
Импортировать URL-адрес Импорт urllib.parse
Импортировать робот-парсер Импорт urllib.robotparser
из urllib import FancyURLopener
из urllib import urlencode
из urllib.request import FancyURLopener
из urllib.parse import urlencode
от urllib2 import Запрос
от urllib2 import HTTPError
из urllib.request import Запрос
из urllib.error import HTTPError

Раньше модули urllib в Python 2 имели широкий спектр функций, включая urlopen, используемый для получения данных, а также полезный для разделения URL-адресов на их составные части. В новом пакете urllib эти функции организованы более логично. В Python 3 предыдущие модули urllib2 были включены в пакет urllib. В то же время в urllib2 все ваши любимые вещи будут присутствовать в модулях urllib Python 3, такие как build_opener (), Request (), HTTPBasicAuthHandler (), friends (). Модуль urllib.parse в Python 3 содержит все парализующие функции в оригинальном модуле urlparse в Python 2. Модуль urllib.robotparse анализирует файл robots.txt. Класс FancyURLopener, который обрабатывает HTTP-переадресацию и другие коды состояния, остается действительным в модуле urllib.request в Python 3. Объект Request остается действительным в urllib.request, но такие константы, как HTTPError, были перенесены в urllib.error. Я упоминал, что 2to3 также переписывает ваши вызовы функций? Например, если вы импортировали модуль urllib в Python 2 и вызвали функцию urllib.urlopen))) для получения данных, 2to3 будет одновременно изменять заявку на импорт и вызов функции.

Примечания Python 2 Python 3
import urllib print urllib.urlopen ((()http://diveintopython3.org/’) читать)) import urllib.request, urllib.parse, urllib.error
print ((urllib.request.urlopen)) "http://diveintopython3.org/’) читать))))
  • dbm Все клоны DBM теперь находятся в отдельном пакете, называемом dbm. Если вам нужен какой-то конкретный вариант, например, GNUDBM, вы можете импортировать соответствующий модуль в пакет dbm.
Примечания Python 2 Python 3
Импортный дбм Импорт дбм.дбм
Импорт gdbm импортdbm.gnu
Импорт dbhash Импорт dbm.bsd
Импортировать Dumbdbm Импорт dbm.dumb
импортировать любой
импортировать любой
Импортный дбм
  • xmlrpc XML-RPC - это легкий метод выполнения удаленных вызовов RPC через протокол HTTP. Некоторые реализаторы клиентов XML-RPC и серверов XML-RPC теперь объединены в отдельные пакеты, называемые xmlrpc.
Примечания Python 2 Python 3
Импорт xmlrpclib Импорт xmlrpc.client
Импорт DocXMLRPCServer
Импорт SimpleXMLRPCServer
Импорт xmlrpc.server
  • Другие модули

Примечания Python 2 Python 3
попробуйте:
импортировать cStringIO как StringIO
за исключением ImportError:
импортировать StringIO
Импорт
Попробуйте:
импортировать cПикл как маринованный маринованный маринованный маринованный маринованный маринованный маринованный маринованный маринованный маринованный маринованный маринованный маринованный маринованный маринованный маринованный маринованный маринованный маринованный маринованный маринованный маринованный маринованный маринованный маринованный маринованный маринованный маринованный маринованный маринованный маринованный маринованный маринованный маринованный маринованный маринованный маринованный маринованный маринованный маринованный маринованный маринованный маринованный маринованный маринованный маринованный маринованный мари
импортируемые огурцы
Импорт _Построенный Импорт построек
Импортировать copy_reg импортировать копирег
Импортная очередь очередь импорта
импортировать SocketServer Импорт сервера сокетов
импортировать ConfigParser импортировать конфигуратор
Импортный отпуск Импорт reprlib
команды импорта импортный подпроцесс

1, в Python 2 вы обычно делаете это, сначала пытаясь импортировать cStringIO в качестве альтернативы StringIO, и если это не удается, импортируйте StringIO снова. Не делайте этого в Python 3; модуль io поможет вам с этим справиться. 2, в Python 2, внедрение наиболее быстрого пиклевого выполнения также является полезным методом, аналогичным тому, что показано выше. В Python 3, модуль пикле автоматически обрабатывается для вас, поэтому не делайте этого снова. 3, модуль builtins содержит глобальные функции, классы и константы, которые будут использоваться во всем языке Python. Переопределение какой-то функции в модуле builtins означает переопределение этой глобальной функции повсюду. Это звучит мощно, но в то же время и ужасно. 4, модуль copyreg добавляет поддержку модуля pickle для пользовательских пользовательских типов, определенных в языке C. 5, модуль очереди реализует очередь производителя-потребителя ("multi-producer, multi-consumer queue"). Модуль Socketserver предоставляет общие базовые классы для реализации различных сокет-серверов. 7. модуль configparser используется для анализа профилей INI-style. 8. модуль reprlib перевёл в жизнь встроенную функцию repr (), и добавил контроль над тем, что длина строк, обозначаемых, была прервана. 9. Модуль подпроцессов позволяет создавать подпроцессы, подключаться к ним, и получать их возвращенные значения.

  • Относительный импорт в пакете

Пакет - это единое целое, состоящее из группы связанных модулей. В Python 2 для взаимоотношений между модулями в одном и том же пакете вы используете import foo или from foo import Bar.2解释器会先在当前目录里搜索foo.pyВ Python 3 этот процесс немного отличается. Python 3 не будет сначала искать в текущем пути, он будет искать прямо в поисковом пути Python. Если вы хотите, чтобы один модуль в пакете импортировал другой модуль в пакете, вам нужно четко предоставить взаимный путь двух модулей.

Предположим, что у вас есть несколько файлов в одном и том же каталоге:

Кардинал/ Ѕудьте осторожны. ±-Инит.py Ѕудьте осторожны.+--константы.py | +--mbcharsetprober.py | +--universaldetector.py

Теперь предположим, что UniversalDetector.py требует полного ввода констант.py.,另外还需要导入mbcharsetprober.py的一个类。你会怎样做?

Примечания Python 2 Python 3
константы импорта из констант.import
из mbcharsetprober импортировать MultiByteCharSetProber Из.mbcharsetprober импортировать MultiByteCharsetProber

1, когда вам нужно импортировать весь модуль из других частей пакета, используйте новый from.import синтаксис.universaldetector.pyИ вы хотите импортировать файлы.constants.pyВ данном примере эти два файла находятся в одном каталоге, поэтому используется однозначный знак. Вы также можете импортировать из родительского каталога ((from... import anothermodule) или из второго каталога. 2, чтобы напрямую импортировать определенный класс или функцию из других модулей в именное пространство вашего модуля, добавить относительный путь в начале модуля, который требуется импортировать, и удалить последний слайд. В этом случае mbcharsetprober.py и universaldetector.py находятся в одном и том же каталоге, поэтому относительное название пути - это строка. Вы также можете импортировать из родительского каталога (от... import anothermodule) или из подкаталога.

  • Метод итератора next ((()

В Python 2 итератор имеет метод next (), который используется для возвращения следующего элемента в последовательности. В Python 3 это также работает, но теперь есть новая глобальная функция next (), которая использует итератора в качестве параметра.

Примечания Python 2 Python 3
Итератор. Следующий ((() Следующий (антитератор)
a_function_that_returns_an_iterator().next() next ((a_function_that_returns_an_iterator())
класс А:
def next ((self):
прошел
класс А:
def _Следующий.(самостоятельно):
класс А:
def next ((self, x, y):
проходит
Нет изменений.
next = 42
для an_iterator в a_sequence_of_iterators:
an_iterator.next()
next = 42
для an_iterator в a_sequence_of_iterators:
an_iterator._Следующий.()

1, самый простой пример, где вы перестаете вызывать метод next ((() для итератора, а теперь вы сами передаете итератор как аргумент к глобальной функции next ((() ‒ 2, если у вас есть функция, которая возвращает значение итератора, вызовите эту функцию и передайте результат в качестве параметра функции next (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( В-третьих, если вы задумались о своем классе и использовали его в качестве итератора, в Python 3 вы можете сделать это, определив специальные методы.Следующий.(), чтобы осуществить. 4, если в классе, который вы определяете, случайно есть next ((), он использует один или несколько параметров, 2to3 не будет его задействовать при выполнении. Этот класс не может использоваться в качестве итератора, так как его метод next (() имеет параметры. 5, это немного сложно. Если вы случайно имеете локальную переменную под названием next, в Python 3 ее приоритет будет выше глобальной функции next (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((Следующий.() для получения следующего элемента в последовательности. Или, вы также можете перестроить код так, чтобы название этой локальной переменной не было next, но 2to3 не сделает этого для вас.

  • Глобальный фильтр функций (((

В Python 2 метод filter ((() возвращает список, который проверяется каждым элементом в последовательности с помощью функции True или False. В Python 3 функция filter ((() возвращает итератор, а не список.

Примечания Python 2 Python 3
фильтр ((a_function, a_sequence) список ((фильтр ((функция, последовательность))
список ((фильтр ((функция, последовательность)) Нет изменений.
фильтр ((Ничего, a_sequence) [i для iin a_sequence если i]
для i в фильтре ((Нет, a_sequence): Нет изменений.
[i для фильтра ((a_function, a_sequence) ] Нет изменений.

В самом простом случае, 2to3 использует функцию list ((() для упаковки фильтра (((), а функция list ((() проходит через его параметры и возвращает список. 2, однако, если призыв filter() уже был обернут list(), 2to3 больше не будет обрабатывать, поскольку в этом случае не имеет значения, является ли возвращенное значение filter() итератором. Для обработки специального синтаксиса filters (None,...) 2to3 преобразует этот вызов из грамматически эквивалентного в список анализа. 4, поскольку цикл for проходит через всю последовательность, не требуется никаких изменений. 5, как и выше, не требуется никаких изменений, поскольку анализ списка будет проходить по всей последовательности, и даже если filter ((() возвращает один итератор, он все равно будет работать так же, как и предыдущий filter ((() возвращает список.

  • Глобальная функция map ((()

Как и в случае с фильтром ((), функция map (() теперь возвращает итератор.

Примечания Python 2 Python 3
Карта ((a_function,PapayaWhip) Список (карта) (функция)
Карта ((Нет, Папайя Вип) Список (( PapayaWhip)
карта ((ламбда х: х+1, диапазон ((42)) [x+1 для x в диапазоне ((42) ]
для i в карте ((a_function, a_sequence): Нет изменений.
[i для карты (a_function,a_sequence) ] Нет изменений.

1, аналогично обработке filter (), в самом простом случае 2to3 использует функцию list (), чтобы обернуть вызов map (). 2、 для специального map ((None,...) синтаксиса, аналогично filter ((None,...) 2to3 преобразует его в эквивалентный вызов list ((). 3, если первым параметром map (()) является функция lambda, то 2to3 преобразует её в равнозначное перечисление. 4, для циклов for, которые проходят через всю последовательность, изменения не требуются. 5, опять же, здесь нет необходимости в изменениях, так как список будет анализироваться по всей последовательности, и он будет работать нормально, даже если возвращенное значение map ((() является итератором, а не списком.

  • Глобальная функция reduce ((()

В Python 3 функция "reduce" была удалена из глобального именного пространства и теперь находится в модуле fucntools.

Примечания Python 2 Python 3
уменьшить ((a, b, c) из функциональных инструментов импортируемые
  • Глобальная функция apply ((()

В Python 2 есть глобальная функция, называемая apply (), которая использует функцию f и список [a, b, c] в качестве параметров и возвращает значение f (a, b, c). Вы также можете сделать то же самое, напрямую вызвав эту функцию и добавив звездочку ((*) перед списком в качестве параметра. В Python 3 функция apply (() больше не существует; необходимо использовать знаки звездочек.

Примечания Python 2 Python 3
Применить ((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)
применять ((a_function, a_list_of_args+ z) a_function ((*a_list_of_args+ z)
применять ((aModule.a_function, a_list_of_args) aModule.a_function ((*a_list_of_args)

1, в простейшей форме, можно вызвать функцию, добавив звездочку перед списком параметров ((как [a, b, c]). Это эквивалентно функции apply (() в Python 2. 2, В Python 2, функция apply ((() может иметь три параметра: функцию, список параметров, словарь именных аргументов. В Python 3 вы можете добавить звездочку перед списком параметров.), добавить две звезды ((**) перед параметрами имени словаря для достижения того же эффекта. 3, оператор + здесь используется как функция соединительного списка, и имеет более высокий приоритет, чем оператор, поэтому нет необходимости добавлять дополнительные скобки вокруг a_list_of_args + z. 4, 2to3 скрипты достаточно умны, чтобы преобразовывать сложные призывы к приложению, включая призывы к импортируемым функциям.

  • Глобальная функция intern (((

В Python 2 вы можете использовать функцию интерна (intern) для ограничения ее на строке для достижения оптимизации производительности. В Python 3 функция интерна (intern) перенесена в модуль sys.

Примечания Python 2 Python 3
intern ((aString) sys.intern ((aString)
  • Использование exec

Так же, как print становится функцией в Python 3, так и exec использует строку с любым кодом Python в качестве параметра, а затем выполняет ее как выполнение или выражение..exec похож наeval, но более мощный и утонченный.

Примечания Python 2 Python 3
exec codeСтраница exec ((codeСтраница)
exec codeСтраница в a_global_namespace exec ((codeString, a_global_namespace)
exec codeСтраница в a_global_namespace, a_local_namespace exec ((codeString, a_global_namespace,a_local_namespace)

1, в простейшей форме, потому что exec ((() теперь является функцией, а не предложением, 2to3 окружает этот код в виде строки скобками. 2, exec в Python 2 может указывать именное пространство, которое будет выполняться в частном пространстве, состоящем из глобальных объектов. Python 3 также имеет такую функцию; вам просто нужно передать это именное пространство в качестве второго параметра функции exec (). 3, еще более удивительно, что в Python 2 exec-заявление также может указывать локальное именное пространство (например, объявленные в функции переменные).

  • Использование execfile

Как и в предыдущих exec-статьях, executefile в Python 2 может использовать строки так же, как выполняет Python-код; в отличие от exec, который использует строки, а execfile использует файлы. В Python 3 execfile уже удалена. Если вы действительно хотите выполнить Python-код в файле, но не хотите импортировать его, вы можете сделать это, открыв этот файл, прочитав его содержимое, а затем вызвав compile) global function.

Примечания Python 2 Python 3
execfile ((a_filename) exec(compile(open ((a_filename).read(),a_filename,exec))
  • repr (в обратных цитатах)

В Python 2 для получения строки для любого объекта существует способ упаковать объект в обратные цитаты (например,xВ Python 3 эта способность сохранилась, но вы больше не можете использовать цитаты для получения этой строки.

Примечания Python 2 Python 3
`x` repr ((x)
` Папайя Вип + `2 ` Отзыв (( Папайя Вип + отзыв ((2))

1, помните, что x может быть чем угодно: класс, функция, модуль, основной тип данных и т. д...repr))) Функция может использовать параметры любого типа. 2, в Python 2 антиквитанция может быть встроена, что приводит к этому запутанному (но эффективному) выражению. 2to3 достаточно умны, чтобы преобразовать этот вход в встроенный вызов в функцию repr.

  • Попробуйте... исключите фразу

В Python 2 и Python 3 синтаксис, используемый для захвата аномалий, немного изменился.

Примечания Python 2 Python 3
попробуйте:
импортировать мимодуль
за исключением ImportError, e
pass
попробуйте:
импортировать mymodule
за исключением ImportError как e:
пропускать
попробуйте:
импортировать мимодуль
за исключением (RuntimeError, ImportError), e
pass
try:
import mymodule
except (RuntimeError, ImportError) как e:
pass
Попробуйте:
импортировать мимодуль
за исключением ImportError:
пройти
Нет изменений.
попробуйте:
импортировать mymodule
кроме:
пройти
Нет изменений.

1, в отличие от Python 2, в котором после необычного типа добавляется кома, Python 3 использует новое ключевое слово, as. 2, ключевое слово as также может быть использовано в случаях, когда захватывается несколько типов аномалий одновременно. Если вы поймали отклонение, но не хотите получить доступ к самому объекту отклонения, то синтаксис Python 2 и Python 3 одинаковый. 4, аналогично, если вы используете защитный метод (fallback) для захвата всех отклонений, то синтаксис Python 2 и Python 3 одинаковый. При вводе модулей (или в большинстве других случаев) вы абсолютно не должны использовать этот метод (см. Fallback). В противном случае программа может поймать такие исключения, как Keyboard Interrupt (если пользователь нажимает Ctrl-C, чтобы прервать программу), что делает дешифровку более сложной.

  • выражение "повысить"

В Python 3 существует небольшое изменение в грамматике, чтобы исключить пользовательские исключения.

Примечания Python 2 Python 3
поднять MyException без изменений
Поднимите MyException, сообщение об ошибке поднять MyException (( сообщение об ошибке)
поднять MyException, сообщение об ошибке, a_traceback поднять MyException ((errormessage).with_traceback ((a_traceback)
поднять сообщение об ошибке не поддерживается

1, выбросить исключения, не приносящие пользователю настраиваемых ошибочных сообщений, в этом простейшем виде, синтаксис не меняется. 2, когда вы хотите выбросить исключение с пользовательскими ошибками, изменение становится очевидным. Python 2 использует запятую для разделения исключений и ошибок; Python 3 передает ошибки в качестве параметров для исключений. Python 2 поддерживает более сложный синтаксис, чтобы выбросить исключение с пользовательскими настройками. В Python 3 вы также можете сделать это, но синтаксис совершенно другой. В Python 2 вы можете выбросить исключение без исключения класса, только одно сообщение об исключении. В Python 3 эта форма больше не поддерживается. 2to3 будет предупреждать вас, что он не может автоматически исправить этот синтаксис.

  • Метод выброса генератора

В Python 2 у генератора есть метод throw (), который призыв a_generator.throw (), когда генератор приостанавливается, выкидывает исключение и возвращает следующее значение, полученное функцией генератора. В Python 3 эта функция все еще доступна, но немного отличается в грамматике.

Примечания Python 2 Python 3
a_generator.throw ((MyException)) Нет изменений.
a_generator.throw ((MyException, сообщение об ошибке) a_generator.throw ((MyException (( сообщение об ошибке))
a_generator.throw ((сообщение об ошибке) не поддерживается

1, в простейшей форме, генератор выбрасывает исключения без пользовательских ошибочных сообщений; в этом случае синтаксически ничего не меняется от Python 2 к Python 3. Если генератор бросает исключение с пользовательским настроенным сообщением об ошибке, вы должны передать эту строку с ошибкой к классу исключений для его инстанциализации. 3, Python 2 также поддерживает исключения, в которых выбрасывается только исключительная информация. Python 3 не поддерживает этот синтаксис, и 2to3 показывает предупредительное сообщение, сообщающее вам, что вам нужно вручную исправить этот код.

  • Глобальная функция xrange (())

В Python 2 есть два способа получить числа в определенном диапазоне: range ((), который возвращает список, и range ((), который возвращает итератор. В Python 3 range (() возвращает итератор, xrange (() больше не существует.

Примечания Python 2 Python 3
xrange ((10) диапазон ((10)
a_list = диапазон ((10) a_list = список ((диапазон)))
[i в пределах диапазона (range) ] [i в пределах диапазона ((10) ]
для i в диапазоне ((10)): Нет изменений.
сумма ((диапазон))) Нет изменений.

1, в самом простом случае 2to3 просто преобразует xrange (()) в range (()). 2, если ваш код Python 2 использует range ((), 2to3 не знает, нужен ли вам список или работает ли итератор. Из осторожности, 2to3 может подать ошибку, а затем использовать list (() для принудительного преобразования возвращенного значения range (() в тип списка. 3, если в перечислении существует функция xrange (), то нет необходимости преобразовывать ее возвращаемое значение в список, так как перечисление списка также действует на итераторы. 4, аналогично, цикл for также работает на итераторе, так что здесь ничего не меняется. 5, функция sum ((() может работать на итераторе, поэтому 2to3 также не изменяется здесь. Так же, как возвращение значения как вид (view) вместо того, чтобы быть словарным методом списка, это также относится к min (min), max (max), sum (sum), list (list), tuple (tuple), set (set), sorted (sorted), any (any), all (all) (all)).

  • Глобальные функции raw_input (()) и input (())

В Python 2 есть две глобальные функции, которые используются для запроса пользователя на ввод в командной строке. Первая называется input (), которая ждет, пока пользователь вводит Python-выражение (и возвращает результат). Вторая называется raw_input (), и то, что пользователь вводит, возвращает то, что он вводит. Это очень смущает новичков, и это широко воспринимается как пикантный пирог языка Python (wart).

Примечания Python 2 Python 3
raw_input() вход (()
raw_input ((prompt) Ввод (ввод)
вход (() Оценка (ввод)

В простейшей форме, raw_input (()) заменяется на input (()). В Python 2 функция raw_input () может указывать в качестве параметра ссылку. В Python 3 эта функция сохранена. Если вы действительно хотите попросить пользователя ввести Python-выражение, вы можете вычислить результаты, вызвав функцию input (), а затем передать возвращенное значение eval ().

  • Функционное свойство func_*

В Python 2 код в функции дает доступ к специальным свойствам самой функции. В Python 3 эти специальные свойства переименованы для согласованности.

Примечания Python 2 Python 3
a_function.func_name Функция.Имя
a_function.func_doc Функция.Доктора.
a_function.func_defaults Функция.По умолчанию
a_function.func_dict Функция.Диктовка
a_function.func_closure Функция.Закрытие
a_function.func_globals Функция.Глобальные
a_function.func_code Функция.Код_

1, _name__ свойство ((originalfunc_name) содержит имя функции. 2, __doc__ свойство ((originalfuncdoc) содержит документальную строку ((docstring), которую вы определили в исходном коде функции 3, __defaults__ свойства (originalfunc_defaults) - это элементная группа, которая сохраняет параметры в качестве дефолтов. 4, __dict__ свойство ((originalfunc_dict) - это именное пространство, которое поддерживает свойства любых функций. 5, __closure__ свойство (original func_closure) - это элементная группа объектов cell, которая содержит связь функций со свободными переменными (free variables). 6, __globals__ свойство ((originalfunc_globals) - это ссылка на глобальное пространство имен модулей, где сама функция определена. 7, __code__ свойство ((originalfunc_code) - это объект кода, который обозначает компилированный объект функции.

  • Метод ввода/вывода xreadlines

В Python 2 объект файла имеет метод xreadlines (), который возвращает один итератор, который читает файл за одну строку. Это особенно полезно в цикле for. Фактически, более поздние версии Python 2 добавляют такую функцию к самому объекту файла.

В Python 3 метод xreadlines ((() больше не используется. 2to3 может решить простые ситуации, но некоторые крайние случаи требуют искусственного вмешательства.

Примечания Python 2 Python 3
для строки в a_file.xreadlines(): для строки в a_file:
для строки в a_file.xreadlines(5): без изменений (разорвано)

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 не будет использовать его как именный параметр.

Примечания Python 2 Python 3
Ламбда (x,): x+ f ((x) Ламбда x1: x1[0]+f(x1[0])
Ламбда (x, y): x+f(y) Ламбда x_y: x_y[0]+f(x_y[1])
Ламбда (x,(y,z)): x+ y+ z Ламбда x_y_z: x_y_z[0]+x_y_z[1][0]+ x_y_z[1][1]
Ламбда x, y, z: x+y + z без изменений

1, если вы уже определили функцию lambda, она использует элемент, содержащий элемент, в качестве параметра, в Python 3 она будет преобразована в lambda, содержащую ссылку на x1[0]; x1 является сценарием 2to3, автоматически генерируемым на основе именных параметров в оригинальном элементе. 2, с использованием элемента ((x, y) с двумя элементами в качестве параметра, функция lambda преобразуется в x_y, которая имеет два параметра местоположения x_y[0] и x_y[1]; 3, 2to3 сценарии могут даже обрабатывать элементы с использованием параметров имен несет в качестве параметров lambda функций. Результативный код немного сложнее для чтения, но он имеет тот же эффект в Python 3, что и исходный код в Python 2. 4, вы можете определить ламбда-функции с использованием нескольких параметров. Если нет скоб вокруг параметров, Python 2 будет относиться к ним как к ламбда-функции с несколькими параметрами; в этом корпусе ламбда-функций вы ссылаетесь на эти параметры по именам, как это делается в других типах функций.

  • Особые методологические свойства

В Python 2 методы классов имеют доступ к объектам, определяющим их классы, а также к самим объектам методов. im_self является объектом-изображением класса; im_func - объектом-функцией, im_class - классом. В Python 3 эти свойства переименовываются, чтобы следовать соглашениям о наименовании других свойств.

Примечания Python 2 Python 3
aClassInstance.aClassMethod.im_func aClassInstance.aClassMethod._Функция
aClassInstance.aClassMethod.im_self aClassInstance.aClassMethod._Я сам.
aClassInstance.aClassMethod.im_class aClassInstance.aClassMethod._Я сам.._класс_
  • __nonzero__ специальный метод

В Python 2 вы можете создавать свои собственные классы и использовать их в булевом контексте. Например, вы можете инстанциализировать класс и использовать этот объект-инстанцию в предложении if.Не нулевой() метод, который возвращает значение True или False, и который вызывается, когда объект-пример находится в контексте на буле. В Python 3 вы все равно можете выполнять ту же функцию, но название этого особенного метода изменилось.- Что?()。

Примечания Python 2 Python 3
класс А:
def _Не нулевой(самостоятельно):
пройти
класс А:
def _- Что?(самостоятельно):
пройти
класс А:
def _Не нулевой(self, x, y):
проходит
Нет изменений.

1, когда в контексте Бура используется объект класса, Python 3 вызывает_- Что?(), а неНе нулевой(■■) Но если у вас есть определение, которое использует два параметра.Не нулевой() метод, 2to3 сценарий предполагает, что этот метод, который вы определили, имеет другое назначение, и поэтому не изменяет код.

  • Тип восьмицифровой

Между Python 2 и Python 3 существует небольшое изменение в грамматике определения октальных чисел.

Примечания Python 2 Python 3
x = 0755 x = 0o755
  • sys.maxint

Поскольку длинные и целые типы были объединены, постоянная sys.maxint перестала быть точной. Однако, поскольку это значение было полезно для возможности обнаружения конкретной платформы, оно было сохранено Python 3 и переименовано в sys.maxsize.

Примечания Python 2 Python 3
от sys importmaxint из sys importmaxsize
a_function ((sys.maxint) a_function ((sys.maxsize)

1, maxint превращается в maxsize. 2, все sys.maxint превратились в sys.maxsize.

  • Глобальная функция callable ((()

В Python 2 вы можете использовать глобальную функцию callable ((() для проверки того, может ли объект быть вызван (callable, например, функция). В Python 3 эта глобальная функция отменена. Для проверки того, может ли объект быть вызван, можно проверить специальные методы.Позвони.(), существование которого.

Примечания Python 2 Python 3
можно вызвать ((что угодно) Ничего, _Позвони.’)
  • Глобальная функция ((zip)

В Python 2 глобальная функция zip ((() может использовать в качестве параметров любые последовательности, возвращающие список, состоящий из элементов. Первый элемент каждого элемента входит в первый элемент каждого элемента, второй элемент входит во второй элемент каждого элемента, и затем перемещается вниз. В Python 3 zip ((() возвращает итератор, а не список.

Примечания Python 2 Python 3
zip ((a, b, c) Список (а, б, в)
d.join ((zip ((a, b, c)) Нет изменений.

В простейшей форме, вы можете восстановить функцию zip, которая была до нее, вызвав возвращенное значение функции list ((() для упаковки zip (((), которая будет переходить через итератор, который возвращает функцию zip (((), а затем возвращает список результатов. В контекстуальных условиях, где уже проходят все элементы последовательности (например, призыв к методу join), итераторы, возвращающие zip, работают нормально.

  • Ошибка StandardError

В Python 2 StandardError является базовым классом для всех других встроенных аномалий, кроме StopIteration, GeneratorExit, KeyboardInterrupt, SystemExit. В Python 3 StandardError был отменен; исключения используются вместо него.

Примечания Python 2 Python 3
x = Стандартная ошибка (()) x = Исключение
x =StandardError ((a, b, c) x = исключение ((a, b, c)
  • Постоянные в модуле types

В модуле types существует множество постоянных, которые помогают вам определить тип объекта. В Python 2 он содержит постоянные, представляющие все базовые типы данных, такие как dict и int. В Python 3 эти постоянные уже отменены.

Примечания Python 2 Python 3
types.UnicodeType str
types.StringType байты
types.DictType диктовка
types.IntType Инт
types.LongType Инт
types.ListType Список
types.NoneType тип ((Нет)
types.BooleanType Буль
types.BufferType памятьview
types.ClassType тип
types.ComplexType сложный
types.EllipsisType тип ((Эллипс)
types.FloatType плыть
types.ObjectType объект
types.NotImplementedType тип ((Не реализован)
types.SliceType ломтичка
types.TupleType тупл
types.TypeType тип
types.XRangeType диапазон

Types.StringType отображается как байты, а не str, потому что строки в Python 2 на самом деле представляют собой последовательность байтов, закодированных с помощью определенного типа символов.

  • Глобальная функция in instance ((()

Функция isinstance проверяет, является ли объект конкретным примером класса или типа. В Python 2 вы можете передать элемент из типа types к инстанции, и если объект является любого типа в элементе, функция возвращает True. В Python 3 вы все равно можете сделать это, но не рекомендуется использовать один тип в качестве параметра дважды.

Примечания Python 2 Python 3
isinstance ((x, ((int,float,int)) isinstance ((x, ((int,float))
  • тип данных basestring

В Python 2 существует два типа строк: Unicode и non-Unicode. Но существует еще один тип, basestring. Это абстрактный тип данных, который является суперклассом str и unicode. Он не может быть прямо вызван или инстанцирован, но вы можете использовать его в качестве параметра для определения того, является ли объект Unicode или non-Unicode.

Примечания Python 2 Python 3
isinstance ((x, базовый строчок) isinstance ((x, str)
  • модуль itertools

В Python 2.3 был введён модуль itertools, который определяет варианты (variants) глобальных функций zip (), map (), filter (), которые возвращают типы итераторов, а не списков. В Python 3 эти варианты были отменены из-за того, что возвращающие типы этих глобальных функций являются итераторами.

Примечания Python 2 Python 3
itertools.izip (а, б) zip ((a, b)
itertools.imap (а, б) Карта (а, б)
itertools.ifilter ((а, б) фильтр ((a, b)
из itertools импортировать imap, izip, foo из itertools импорт foo

1, используйте глобальную функцию zip (), а не itertools.izip (). 2, используйте map (), а не itertools.imap (). 3,itertools.ifilter ((() превращается в filter ((() ‒ 4, модуль itertools остается в Python 3, он просто больше не содержит функций, которые были перенесены в глобальное пространство имен.

  • sys.exc_type, sys.exc_value, sys.exc_traceback

При обработке исключений в модуле sys есть три переменные, к которым вы можете получить доступ: sys.exc_type, sys.exc_value, sys.exc_traceback. На самом деле, они были в эпоху Python 1.

Примечания 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, они необходимы.

Примечания Python 2 Python 3
[i для 1,2] [i для iin(1,2)]
  • Функция os.getcwdu (())

В Python 2 есть функция os.getcwd (), которая возвращает текущий рабочий каталог как строку (некодированную в Unicode). Поскольку современные файловые системы могут обрабатывать имена каталогов, которые могут быть закодированы на несколько символов, Python 2.3 вводит функцию os.getcwdu (), которая возвращает текущий рабочий каталог как строку, закодированную в Unicode.

Примечания Python 2 Python 3
Ос.Getcwdu ((() os.getcwd()
  • Метаклассы

В Python 2 вы можете создать метаклассы, определив параметры метакласса в заявлении класса, или определив свойство __metaclass__ на особом уровне класса. В Python 3 свойство __metaclass__ было отменено.

Примечания Python 2 Python 3
класс C ((метакласс=PapayaMeta):
прошел
без изменений
класс Whip:
_Метакласс_= Папайя Мета
class Whip ((metaclass=PapayaMeta):
пропуск
Класс C ((Крысоловка, Битер):Метакласс_= Папайя Мета Класс C ((Whipper,Beater,metaclass=PapayaMeta):
прошел

1, объявление параметров метакласса при декларировании класса, что действует в Python 2 и Python 3, они одинаковы. 2, в определении класса заявлено, что свойство __metaclass__ действует в Python 2, но не действует в Python 3. 3, 2to3 позволяет построить действительную декларацию класса, даже если класс унаследовал несколько родительских классов.

  • О стиле кода

Нижеперечисленные исправления не являются настоящими исправлениями; т.е. они касаются только стиля кода и не имеют отношения к сути кода. Однако разработчики Python имеют особый интерес в том, чтобы сделать стиль кода как можно более единым. Для этого существует специальный официальный справочник, описывающий стиль кода Python.

  • set (() буквальное значение ((literal))

В Python 2 единственный способ определить буквальный набор - это вызвать set a_sequence. В Python 3 это все еще работает, но использование новой буквальной нотации: большие скобки является более четким методом. Этот метод работает кроме пустых наборов, поскольку словарь также обозначается большими скобками, поэтому {} обозначает пустой словарь, а не пустой набор.

Скрипты 2to3 по умолчанию не восстанавливают значения set (() literal. Для включения этой функции при вызове 2to3 на командной строке укажите параметр -f set_literal.

Примечания Раньше После
множество (([1,2,3]) {1,2,3}
набор (((1,2,3)) {1,2,3}
набор (([i для iin a_sequence]) {i в последовательности}
  • Глобальный буфер функций

Объекты Python, реализованные с использованием C, могут выводить буферный интерфейс, который позволяет другому коду Python читать и писать в блоке памяти напрямую. Это звучит очень мощно, но это также ужасно. В Python 3 буфер был переименован в memoryview. Фактические изменения более сложны, но вы можете почти игнорировать эти различия.

Скрипты 2to3 по умолчанию не восстанавливают функцию buffer (). Для включения этой функции при вызове 2to3 на командной строке указывают параметр -f buffer.

Примечания Раньше После
x = буфер ((y) x = память смотреть ((y)
  • Пробелы вокруг комендатов (очевидно)

Несмотря на строгие требования Python к пробелам для удаления и выделения ("indenting and outdenting"), Python свободен в использовании пробелов в других аспектах. В списках, элементах, наборах и словарях пробелы могут быть перед или после комендатуры, что не имеет никакого негативного влияния. Однако в руководстве по стилю кода Python указано, что перед комендатурой не может быть пробелов, а после комендатуры должно быть пробелы.

Скрипт 2to3 по умолчанию не восстанавливает пробелы вокруг комендатов. Чтобы включить эту функцию, при вызове 2to3 на командной строке укажите параметр -f wscomma.

Примечания Раньше После
a, b a, b
- Да, конечно. {a: b}
  • Обычные идиомы

В Python-сообществе создано множество обычаев. Есть примеры, например, while 1: loop, который восходит к Python 1. (Python не имел действительно значимых буров до Python 2.3, поэтому разработчики раньше использовали 1 и 0 взамен.) Современные программисты Python должны тренировать свои мозги, чтобы использовать современные версии этих обычаев.

Скрипты 2to3 по умолчанию не выполняют починки для этих обычаев. Чтобы включить эту функцию, при вызове 2to3 на командной строке укажите параметр -f idioms.

Примечания Раньше После
в то время как 1:
do_stuff()
пока True:
do_stuff()
тип ((x) == T это случай ((x, T)
тип ((x) - T это случай ((x, T)
a_list = list ((a_sequence)) a_list = сортированный (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

  • 1.自己手动转换

Этого не нужно говорить, если это касается лишь нескольких функций, таких как print и т. д.

Если вы хотите изменить свой код, вы можете сделать это сами.

  • 2.利用Python内置(Python脚本)工具,帮你自动转换

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 2.x:

D:\tmp\tmp_dev_root\python\python2_to_python3\34563264_данные_от_сайта.py

Теперь я хочу преобразовать его в код для Python 3.x.

Вы можете открыть cmd в окне, расположить его под сценарием, который вы хотите преобразовать, и затем запустить

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>&nbsp;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>&nbsp;<a href="#">sales@cinesysinc.com</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>&nbsp;740 SW 21st Ave, Suite #310<br />
RefactoringTool: Files that were modified:
RefactoringTool: 34563264_data_from_site.py

На этом этапе вы можете увидеть, что изначально 345636264_data_from_site.py, превратилось в Python 3.x.


Больше

ФанбэйЧто вы думаете о Python 2?

Маленькие мечтыBotVS использует версию Python 2.7, поддерживаемую для платформы BotVS Python 2 и Python 3.