Изменения между 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
comments   2
hits   4926

Различия и изменения в синтаксисе python2 и python3

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

  • #### print фраза

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

Notes Python 2 Python 3
print 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)
  1. Для вывода пустой строки необходимо вызвать print без параметров ((() ◦
  2. Для вывода отдельного значения необходимо использовать это значение в качестве одного из параметров print ().
  3. Для вывода используйте два значения, разделенные пробелом, используйте два параметра для вызова print (((). В Python 2, если вы используете запятую ((,) в качестве окончания print фразы, она будет разделять результаты вывода с помощью пробелов, а затем выводить следующий пробел ((trailing space), а не выводы carriage return). В Python 3 такой же эффект может быть достигнут путем передачи end=’ ‘ в качестве ключевого параметра print (). В Python 2 вы можете выполнять ту же функцию, перенаправляя вывод в одну трубу, например, sys.stderr, используя синтаксис>>pipe_name. В Python 3 вы можете сделать то же самое, передавая значение трубы в качестве ключевого слова в параметре файла print (((). По умолчанию параметры файла std.stdout, поэтому переназначение его значения приведет к тому, что print ((() будет выводиться в другую трубу.
  • #### Строка Unicode

В 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 .

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

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

Notes Python 2 Python 3
unicode(anything) str(anything)
  • #### long длинный

В 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:
  1. Просто сравнить. 2, сравнение трех относительно сложных значений.
  • #### Словарный метод has_key()

В Python 2 словарный объект has_key ((() - метод, используемый для проверки того, содержит ли словарь определенную клавишу (((key) . Этот метод больше не поддерживается в Python 3 . Вам нужно использовать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
  1. Функция list () преобразует возвращенные значения keys () в статический список, и из соображений безопасности 2to3 может ошибаться. Такой код эффективен, но для использования визуализации он неэффективен. Вы должны проверить код после преобразования, чтобы увидеть, нужен ли вам список, и, возможно, визуализация может сделать то же самое.
  2. Это другой вид преобразования метода {{item}}, {{item}}) в список ◄ 2to3 возвращает значения метода {{values}}, {{item}}.
  3. В 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
import SimpleHTTPServer
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
urllib.parse,urllib.error
import urllib2 import urllib.request
urllib.error
import urlparse import urllib.parse
import robotparser import urllib.robotparser
from urllib import FancyURLopener
from urllib import urlencode
from urllib.request import FancyURLopener
from urllib.parse import urlencode
from urllib2 import Request
from urllib2 import HTTPError
from urllib.request import Request
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
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
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
import SimpleXMLRPCServer
import xmlrpc.server
  • #### Другие модули
Notes Python 2 Python 3
try:
  import cStringIO as StringIO
except ImportError:
  import StringIO
import io
try:
  import cPickle as pickle
except ImportError: 
  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
  1. В Python 2 вы обычно делаете это, сначала пытаясь импортировать cStringIO в качестве замены для StringIO, а если это не удается, то импортируйте StringIO. Не делайте этого в Python 3; модуль io поможет вам справиться с этим. Он найдет самый быстрый способ реализации, который доступен, и будет использовать его автоматически.
  2. В Python 2 импортировать самую быструю реализацию пиккеля - это тоже очень полезный способ. В Python 3 модуль пиккеля делает это за вас, поэтому не делайте этого больше.
  3. модуль builtins содержит глобальные функции, классы и константы, которые используются во всем языке Python. Переопределение какой-либо функции в модуле builtins означает переопределение этой глобальной функции повсюду. Это звучит мощно, но в то же время и ужасно.
  4. модуль copyreg добавляет поддержку модуля pickle для пользовательских типов, определенных в языке C. 5, модуль “queue” реализует многопроизводительскую, многопотребительскую очередь (multi-producer, multi-consumer queue) [2].
  5. Модуль 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) или из подкаталога.

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

В 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:
  def next(self):
  pass|class A:
  def next(self):
  pass| |④|class A:
  def next(self, x, y):
  pass|no change | |⑤|next = 42
for an_iterator in a_sequence_of_iterators:
  an_iterator.next()|next = 42
for an_iterator in a_sequence_of_iterators:
  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 () возвращал список.

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

Как и в случае с 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 () является итератором, а не списком, оно будет работать нормально.

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

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

Notes Python 2 Python 3
reduce(a, b, c) from functools import reduce reduce(a, b, c)
  • #### Глобальная функция apply

В Python 2 есть глобальная функция apply (), которая использует функцию f и список.[a, b, c] возвращает в качестве аргумента значение f ((a, b, c) . Вы также можете добавить звездочку (() перед списком, вызвав эту функцию напрямую.*В 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 (), включая призывы к функциям в модуле импорта.

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

В 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 () также имеет такую функцию.

  • #### Заявление execfile

В отличие от 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’))
  • #### repr (в запятых)

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

Notes Python 2 Python 3
`x` repr(x)
`‘PapayaWhip’ + `2`` repr(‘PapayaWhip’+ repr(2))
  1. Помните, что x может быть чем угодно: классом, функцией, модулем, базовым типом данных и т. д. 2, в Python 2 обратная ссылка может быть встроена, что приводит к этому запутанному (но эффективному) выражению . 2to3 достаточно умны, чтобы преобразовать этот встроенный вызов в функцию .
  • #### try…except фраза

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

Notes Python 2 Python 3
try:
  import mymodule
except ImportError, e
  pass
try:
  import mymodule
except ImportError as e:
  pass
try:
  import mymodule
except (RuntimeError, ImportError), e
  pass
try:
  import mymodule
except (RuntimeError, ImportError) as e:
  pass
try:
  import mymodule
except ImportError:
  pass
no change
try:
  import mymodule
except:
  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), что затрудняет дебютирование.

  • #### Заявление raise

В 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
  1. исключить исключения, не содержащие пользовательских ошибочных сообщений, при этом в простейшей форме грамматика не изменяется;
  2. Изменение становится очевидным, когда вы хотите выбросить исключение с пользовательскими ошибочными сообщениями. Python 2 использует запятую для разделения исключений и ошибок; Python 3 передает ошибки в качестве параметров к исключениям.
  3. Python 2 поддерживает более сложный синтаксис, чтобы выбрасывать исключения с пользовательским отслеживанием. В Python 3 вы можете сделать это, но в совершенно ином синтаксисе. 4 В Python 2 вы можете выбрасывать исключение без исключительного класса, имея только одну исключительную информацию. В Python 3 эта форма больше не поддерживается. 2to3 предупредит вас, что он не может автоматически исправить этот синтаксис.
  • #### Метод throws генератора

В 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
  1. в простейшей форме генератор выводит исключения без пользовательских ошибочных сообщений. В этом случае нет изменений в синтаксисе от Python 2 до Python 3.
  2. Если генератор выбросит исключение с пользовательским ошибочным сообщением, вам нужно передать этот ошибочный сигнал в строку ((error string) к классу исключений, чтобы инстанционировать его. 3 , Python 2 также поддерживает исключения, в которых выделяется только информация об исключениях. Python 3 не поддерживает такой синтаксис, и 2to3 отображает предупредительное сообщение, говорящее вам, что вам нужно вручную исправить этот код.
  • #### Глобальная функция xrange

В 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 ((().

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

В 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()。

  • #### Функциональное свойство func_*

В 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、closureattribute ((originalfunc_closure) - это подгруппа, состоящая из объектов cell, которая содержит связь функции со свободной переменной ((free variable)). 6、globals атрибут ((originalfunc_globals) - это ссылка на модуль глобального именного пространства, в котором сама функция определена. 7、code атрибут ((originalfunc_code) - это объект кода, который представляет собой компилированное функциональное тело.

  • #### I/O методы xreadlines

В 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):