Автор оригинала: Arun Ravindran.
Если вы уже уверены, что используете Python 3, вы можете сразу перейти к разделу «Python 2 vs Python 3» со шпаргалкой
Каждый раз, когда упоминается Python 3, ведутся жаркие споры. Некоторые думают, что это ненужный сдвиг и следует продолжить серию Python 2. Однако я выбрал Python 3 для своей книги , потому что я твердо верю, что это будущее языка. Кроме того, разрыв может быть не таким большим, как вы думаете.
Почему Python 3?
Подумайте о своем любимом языке программирования и о том, что вам нравится в нем. А теперь подумайте о вещах, которые вам не нравятся, или о том, что вам хотелось бы улучшить. Иногда эти улучшения могут нарушить работу старых кодовых баз, но они вам очень нужны.
А теперь представьте, что создатель языка возьмет на себя задачу обновить язык и избавиться от бородавок. Это то, что на самом деле привело к Python 3 – Гвидо руководил усилиями по устранению некоторых фундаментальных недостатков дизайна с помощью серии 2.x, основываясь на более чем пятнадцатилетнем опыте разработки успешного языка.
Хотя разработка Python 3 началась в 2006 году, его первая версия, Python 3.0, была выпущена 3 декабря 2008 года. Основными причинами обратной несовместимости версии были: переход на Unicode для всех строк, более широкое использование итераторов, очистка устаревших функций. например, классы старого стиля и некоторые новые синтаксические дополнения, такие как оператор nonlocal
.
Разработка Python 2.7 должна была закончиться в 2015 году, но была продлена еще на пять лет до 2020 года. Python 2.8 не будет. Вскоре все основные дистрибутивы Linux полностью перешли на использование Python 3 по умолчанию. Многие провайдеры PaaS, такие как Heroku, уже поддерживают Python 3.4.
Python 2 и Python 3 параллельно разрабатывались основной группой разработчиков в течение нескольких лет. В конечном итоге ожидается, что Python 3 станет будущим языка.
Портирование Django
Реакция на Python 3 в сообществе Django была довольно неоднозначной. Несмотря на то, что языковые изменения между версиями 2 и 3 были небольшими (и со временем уменьшились), перенос всей кодовой базы Django потребовал значительных усилий по миграции.
Django поддерживает Python 3 с версии 1.5. Фактически, стратегия заключалась в том, чтобы переписать код на Python 3 и рассмотреть Python 2 как требование обратной совместимости.
Большинство пакетов, перечисленных в Стене сверхспособностей Python 3 , стали зелеными (что означает, что они поддерживают Python 3). Практически все красные имеют активно развивающийся порт Python 3. Также стоит отметить стену сверхспособностей Django , в которой более 67% из 200 самых популярных пакетов Django имеют порт Python 3.
Преимущество Python 3
Многие новички в Django задаются вопросом, использовать ли им Python 2 или 3. Я рекомендую начать с Python 3 по следующим причинам:
Улучшенный синтаксис : исправляет множество уродливых синтаксисов, таких как izip
, xrange
и __unicode__
, делая их более понятными и понятными. zip
, range
и __str__
.
Достаточная сторонняя поддержка : из 200 ведущих сторонних библиотек более 80% поддерживают Python 3.
Без устаревшего кода : поскольку они создают новый проект, а не работают с устаревшим кодом, который должен поддерживать старую версию.
По умолчанию на современных платформах : это уже интерпретатор Python по умолчанию в Arch Linux. Ubuntu и Fedora планируют завершить переход в будущем выпуске.
Это просто : с точки зрения разработки Django изменений так мало, что их можно изучить за несколько минут.
Последний пункт важен. Даже если вы знаете Python 2, вы можете освоить Python 3 за короткое время.
Python 2 против Python 3
В этом разделе рассматриваются наиболее важные изменения в Python 3 с точки зрения разработчика Django. Чтобы понять полный список изменений, обратитесь к разделу рекомендованного чтения в конце.
Примеры приведены как для Python 2, так и для Python 3. В зависимости от вашей установки, все команды Python 3, возможно, потребуется изменить с python
на python3
или python3. 4
для вызова интерпретатора.
Измените все методы __unicode__ на __str__
В Python 3 метод __str __ ()
вызывается для строкового представления ваших моделей, а не для неудобного звучания метода __unicode __ ()
. Это один из наиболее очевидных способов идентифицировать перенесенный код Python 3.
Python 2
Python 3
class Person(models.Model): name = models.TextField()
def unicode(self): return self.name
class Person(models.Model): name = models.TextField()
def str(self): return self.name
Это отражает разницу в том, как Python 3 обрабатывает строки. В Python 2 удобочитаемое представление класса могло быть возвращено с помощью __str __ ()
(байты) или __unicode __ ()
(текст). Однако в Python 3 читаемое представление просто возвращается с помощью __str __ ()
(текст).
Все классы наследуются от объекта
В Python 2 есть два типа классов: старый (классический) и новый. Классы нового стиля – это классы, которые прямо или косвенно наследуются от object
. Только новые классы стилей могут использовать расширенные функции Python, такие как слоты, дескрипторы и свойства. Многие из них используются Django. Однако по соображениям совместимости классы по-прежнему оставались старыми.
В Python 3 классов старого стиля больше не существует. Как видно ниже, даже если вы явно не упоминаете какие-либо родительские классы, класс object
будет присутствовать в качестве базового. Итак, все классы нового стиля.
Python 2
Python 3
>>> class CoolMixin: … pass >>> CoolMixin.bases ()
>>> class CoolMixin: … pass >>> CoolMixin.bases (
,)
Вызов super () проще
Более простой вызов super ()
без аргументов избавит вас от набора текста в Python 3.
Python 2
Python 3
class CoolMixin(object):def do_it(self): return super(CoolMixin, self).do_it()
class CoolMixin:def do_it(self): return super().do_it()
Указание имени класса и экземпляра не является обязательным, что делает ваш код СУХИМ и менее подверженным ошибкам при рефакторинге.
Относительный импорт должен быть явным
Представьте себе следующую структуру каталогов для пакета с именем app1
:
/app1
/__init__.py
/models.py
/tests.py
Теперь, в Python 3, давайте запустим следующее в родительском каталоге app1
:
$ echo "import models" > app1/tests.py
$ python -m app1.tests
Traceback (most recent call last):
... omitted ...
ImportError: No module named 'models'
$ echo "from . import models" > app1/tests.py
$ python -m app1.tests
Внутри пакета вы должны использовать явный относительный импорт, ссылаясь на родственный модуль. Вы можете опустить __init__.py
в Python 3, хотя он обычно используется для идентификации пакета.
В Python 2 вы можете использовать import models
для успешного импорта модуля models.py
. Но это было неоднозначно и могло случайно импортировать любой другой models.py
на вашем пути Python. Следовательно, это запрещено в Python 3 и не рекомендуется в Python 2. Используйте из. вместо этого импортируйте модели
.
HttpRequest и HttpResponse имеют типы str и bytes
В Python 3, согласно PEP 3333 (поправки к стандарту WSGI), мы стараемся не смешивать данные, поступающие или отправляемые через HTTP, которые будут в байтах; в отличие от текста во фреймворке, который будет нативными (Unicode) строками.
По сути, для объектов HttpRequest
и HttpResponse
:
- Заголовки всегда будут объектами str
- Потоки ввода и вывода всегда будут байтовыми объектами.
В отличие от Python 2, строка и байты не преобразуются неявно при выполнении сравнений или конкатенации друг с другом. Строки означают только строки Unicode.
Изменения и улучшения синтаксиса исключений
Синтаксис и функциональность обработки исключений в Python 3 были значительно улучшены.
В Python 3 вы не можете использовать синтаксис, разделенный запятыми, для предложения except. Вместо этого используйте ключевое слово as
:
Python 2
Python 3
try: pass except BaseException, e: pass
try: pass except BaseException as e: pass
Новый синтаксис также рекомендуется для Python 2.
В Python 3 все исключения должны быть производными (прямо или косвенно) из BaseException
. На практике вы можете создавать собственные исключения, унаследовав их от класса Exception
.
В качестве значительного улучшения в системе отчетов об ошибках, если во время обработки исключения возникает исключение, сообщается вся цепочка исключений:
Python 2
Python 3
>>> try: ... print(undefined) ... except Exception: ... print(oops) ... Traceback (most recent call last): File "", line 4, in NameError: name 'oops' is not defined
>>> try: ... print(undefined) ... except Exception: ... print(oops) ... Traceback (most recent call last): File "", line 2, in NameError: name 'undefined' is not defined During the handling of the preceding exception, another exception occurred:
Traceback (most recent call last): File "
", line 4, in NameError: name 'oops' is not defined
Как только вы привыкнете к этой функции, вам ее обязательно будет не хватать в Python 2.
Стандартная библиотека реорганизована
Основные разработчики очистили и лучше организовали стандартную библиотеку Python. Например, SimpleHTTPServer
теперь находится в модуле http.server
:
Python 2
Python 3
$ python -m SimpleHTTPServer Serving HTTP on 0.0.0.0 port 8000 ...
$ python -m http.server Serving HTTP on 0.0.0.0 port 8000 ...
Новые вкусности
Python 3 – это не только исправления языка. Здесь также происходит передовая разработка Python. Это означает улучшения в языке с точки зрения синтаксиса, производительности и встроенных функций.
Некоторые из примечательных новых модулей, добавленных в Python 3:
asyncio
: асинхронный ввод-вывод, цикл событий, сопрограммы и задачи.unittest.mock
: библиотека имитационных объектов для тестирования.pathlib
: пути объектно-ориентированной файловой системы.statistics
: функции математической статистики.
Даже если у некоторых из этих модулей могут быть резервные копии для Python 2, более привлекательно перейти на Python 3 и использовать их как встроенные модули.
Большинство серьезных разработчиков Python предпочитают использовать виртуальные среды. virtualenv довольно популярен для изоляции вашего проекта от общесистемной установки Python. К счастью, Python 3.3 интегрирован с аналогичной функциональностью с помощью модуля venv
.
Начиная с Python 3.4, новая виртуальная среда будет предварительно установлена с помощью популярного установщика pip:
$ python -m venv djenv
[djenv] $ source djenv/bin/activate
[djenv] $ pip install django
Обратите внимание, что командная строка изменяется, показывая, что ваша виртуальная среда активирована.
Прочие изменения
Мы не можем вместить все изменения и улучшения Python 3 в этот пост. Но другие часто упоминаемые изменения:
- print теперь является функцией : раньше это был оператор, т.е. аргументы не были в скобках.
- Целые числа не переполняются :
sys.maxint
устарел, целые числа будут иметь неограниченную точность. - Оператор неравенства
<>
удален : используйте вместо него>. - Истинное целочисленное деление : в Python 2
3/2
будет оцениваться как 1. Оно будет правильно оценено как1,5
в Python 3. - Используйте
range
вместоxrange
:range ()
теперь будет возвращать итераторы какxrange ()
раньше работал. - Ключи словаря – это представления : классы, подобные
dict
иdict
(например,QueryDict
), будут возвращать итераторы вместо списков для Вызовы методовkeys ()
,items ()
иvalues ()
.
Эта статья представляет собой отрывок из книги Аруна Равиндрана «Шаблоны дизайна Django и лучшие практики»
Дальнейшая информация
- Прочтите Что нового в Python 3.0 от Гвидо https://docs.python.org/3/whatsnew/3.0.html
- Чтобы узнать, что нового в каждой версии Python, прочтите _Что нового в Python_ https://docs.python.org/3/whatsnew/
- Подробные ответы о Python 3 см. В разделе Вопросы и ответы о Python 3 Ника Коглана http://python-notes.curiousefficiency.org/en/latest/python3/questions_and_answers.html