Рубрики
Без рубрики

Шпаргалка по Python 3 для Djangonauts

Автор оригинала: 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 в этот пост. Но другие часто упоминаемые изменения:

  1. print теперь является функцией : раньше это был оператор, т.е. аргументы не были в скобках.
  2. Целые числа не переполняются : sys.maxint устарел, целые числа будут иметь неограниченную точность.
  3. Оператор неравенства <> удален : используйте вместо него>.
  4. Истинное целочисленное деление : в Python 2 3/2 будет оцениваться как 1. Оно будет правильно оценено как 1,5 в Python 3.
  5. Используйте range вместо xrange : range () теперь будет возвращать итераторы как xrange () раньше работал.
  6. Ключи словаря – это представления : классы, подобные dict и dict (например, QueryDict ), будут возвращать итераторы вместо списков для Вызовы методов keys () , items () и values () .

Эта статья представляет собой отрывок из книги Аруна Равиндрана «Шаблоны дизайна Django и лучшие практики»

Дальнейшая информация