У січні 2020 року офіційно завершилась підтримка старої мажорної версії Python 2.

Будь який ваш новий проект варто починати уже на новій версії мови Python, а саме на версії 3.

Якщо ж ви займаєтесь довготривалим Python 2 проектом із великою кількістю коду, тоді рекомендую розробити стратегію повільної адаптації проекту під нову версію. Перехід не повинен бути важким і ризиковим. Можна доволі просто підтюнити ваш код так, щоб він одночасно працював і для Python 2 і Python 3.

В даній статті я наведу перелік основних відмінностей даних версій мови.

Мова піде більше про синтаксичні відмінності і базові концептуальні речі і менше про зовнішні бібліотеки, які перестали працювати на новому Python 3.

То ж, що нам приготував Python 3?

Це перша стаття у серії “Тримайте Ваш Python / Django Проект в Тонусі”.

Ми розпочали дану серії статтей у межах роботи над оновленням нашого бестселлера “Веб-розробка з Python та Django для Початківців” від версій Python 2 / Django 1.7 до Python 3 / Django 2.

В даній серії статтей ми покажемо як мігрувати не лише на нові Python та Django, але й оновлену роботу із фреймворками типу Twitter Bootstrap, деплойментом на найновіші Python/Django хостинги і тд. В майбутньому в дану серію статтей ми постійно додаватимемо інструкції по міграції на нові версії. Так що додавайте собі у закладки.

Якщо хочете першими отримувати новини про чергову статтю у серії “Тримайте ваш Python/Django Проект UP TO DATE”, підписуйтесь у формі внизу.

Отже, які основні відмінності між Python 2 та Python 3. Давайте розберемо по черзі:

1. Оператор Ділення

Ось який результат ви отримаєте в результаті операції ділення у різних версіях Python:

Інтерпретатор не видасть вам помилок. Тому, якщо ви хочете уникнути прихованих проблем, використовуйте змінні типу флоат із операцією ділення:

 

2. Unicode

В Python 2 тип стрічки (str) є по замовчуванню закодованим у ASCII кодування.

В Python 3 тип стрічки є юнікодом (unicode).

Тобто тепер не потрібно конвертувати в стрічку в юнікод, робити операції і з нею і перед тим, як зберігати дані (в базу даних чи у файлову систему), знову повертати її у стрічку.

Натомість, ви отримуєте одразу юнікод, працюєте з ним, і далі віддаєте юнікод. Python 3 зробить всю важку роботу за вас.

 

3. xrange

xrange із Python 2 більше не існує в Python 3.

В Python 3 ми маємо лише range. Ця функція робить те, що xrange робила в Python 3.

 

4. Робота з Помилками

Також в Python 3 трохи змінилась робота з помилками. Тепер ми повинні використовувати ключове слово “as” у гілці except:

 

5. __future__ модуль

В Python 3 були введені не сумісні з Python 2 ключові слова та функції, котрі можна імпортнути за допомогою вбудованого модуля __future__ у Python 2.

Рекомендується використовувати __future__ модуль, якщо ви плануєте підтримку Python 3 у своєму коді.

Наприклад, якщо ми хочемо Python 3 цілочисельне ділення використати у Python 2, тоді потрібно виконати відповідний імпорт:

А якщо нам потрібно зробити print як функцію, то ми можемо зробити наступний імпорт:

Додаткові функції, які можна імпортнути із модуля __future__, перечислені у таблиці нижче:

feature optional in mandatory in effect
nested_scopes 2.1.0b1 2.2 PEP 227Statically Nested Scopes
generators 2.2.0a1 2.3 PEP 255Simple Generators
division 2.2.0a2 3.0 PEP 238Changing the Division Operator
absolute_import 2.5.0a1 3.0 PEP 328Imports: Multi-Line and Absolute/Relative
with_statement 2.5.0a1 2.6 PEP 343The “with” Statement
print_function 2.6.0a2 3.0 PEP 3105Make print a function
unicode_literals 2.6.0a2 3.0 PEP 3112Bytes literals in Python 3000

 

6. next() функція

В Python 2 у нас була можливість викликати next() як функцію, а також як метод .next().

Тепер в Python 3 у нас залишилася лише функція.

Для того, щоб отримати значення в ітераторах для Python 3 нам треба використовувати next() метод.

Наприклад, наступний код на Python 2:

потрібно переписати в Python 3 на:

 

7. Витік ітераційної змінної в глобальний простір імен

В Python 2, ітераційна змінна у генераторах списка потрапляла до глобального простору імен.

Тепер у Python 3 цього немає.

 

8. Порівняння різних типів даних

Тепер в Python 3 неможливо порівняти різні типи даних.

Якщо ми спробуємо порівняти їх, то отримаємо TypeError.

 

9. input

В Python 3 функція input() завжди повертає об’єкт str.

10. Ітаративні об’єкти замість списків

Деякі функції та методи тепер повертають так звані ітеративні об’єкти (ренджі) в Python 3, а не списки як це було у Python 2:

Ось список більш часто використовуваних методів та функцій, які більше не повертають списки в Python 3:

  • zip()
  • map()
  • filter()
  • метод словника .keys()
  • метод словника .values()
  • метод словника .items()

 

11.  Округлення десяткових дробів до найближчого парного числа

В Python 3 прийнятий новий стандарт округлення десоткових дробів.

Тепер десяткові округлюються до найближчого парного числа.

 

12.  Функція print

Оператор print у Python 2 був замінений на функцію print()

Це означає, що нам потрібно огорнути об’єкт, який ми хочемо надрукувати, у дужки.

 

Як швидко конвертувати Python 2 до 3?

І на завершення, лайфхак!

Не потрібно всю роботу із міграції вашого коду на Python 3 робити вручну.

Існує кілька інструментів для автоматизації портування кода.

Пам’ятайте, що вони лише допоможуть автоматизувати деякі частини вашого кода, а не весь проект. І тут ви, як программіст, повинні перевірити чи правильно воно промігрувало відповідно до логіки, яку ви очікуєте від вашого коду.

Ось список інструментів, які можуть вам допомогти перевести проект на Python 3:

  • six – бібліотека для підтримки сумістності Python 2 та Python 3;
  • python-modernize – інструмент базований на 2to3 бібліотеці, яка є вбудованою в  Python;
  • caniusepython3 –  щоб дізнатися, які з ваших залежностей блокують використання Python 3.

 

***

Якщо ви вже промігрували не один проект на новий Python 3 – залиште ваш коментар і поділіться досвідом!

В наступних статтях перейдемо ближче до Django веб фреймворку і як він змінився у версії 2.

Якщо хочете отримувати сповіщення про наступні статті у даній серії – підписуйтесь у формі нижче: