Пориньте у Python 3/Що нового?
❝ Isn’t this where we came in? ❞
— Pink Floyd, The Wall
також відомий під назвою “мінусовий рівень"
ред.Ви вже Python програміст? Ви перечитали в оригіналі “Занурення в Python”? Ви купили паперовий примірник? (Якщо так, дякую!) Ви готові з головою пірнути в Python 3? Коли так, читайте далі. Але якщо ні, вам варто почати спочатку.
Python 3 йде в комплекті зі скриптом, що називається 2to3. Вивчіть його. Покохайте його. Використовуйте його. “Перенесення коду в Python 3 за допомогою 2to3” — це довідник усіх змін, які можуть автоматично виправити інструменти 2to3. Оскільки більшість змін є синтаксичними, їх вивчення стане гарним початком. (print відтепер функція, `x` не працює та інше)
“Приклад: перенесення chardet на Python 3” розповідає про мої (врешті-решт, успішні) спроби перенести нетривіальну бібліотеку з Python 2 на Python 3. Можливо, це вам допоможе, а можливо — ні. Навчальна крива виходить доволі крутою, оскільки вам потрібно гарно розібратися в бібліотеці, перш ніж ви зможете зрозуміти, чому вона зламалася і як я все виправив. Найбільш вразливі місця часто розташовані навколо рядків. До речі, щодо рядків...
Рядки... Отакої... Із чого ж розпочати?.. У Python 2 були “strings” та “Unicode strings”. У Python 3 є “bytes” та “strings”. Це означає, що усі рядки відтепер Unicode, і якщо ви хочете працювати із купкою байтів, використовуйте новий байтовий тип. Python 3 ніколи автоматично не здійснюватиме перетворення між strings та bytes, тому, якщо ви не певні будь-якої миті з чим саме працюєте, ваш код майже точно зламається. Для більш детальної інформації дивіться розділ "Текст".
Тема протистояння bytes і strings знову і знову виринатиме на поверхню у цій книзі.
- У розділі "Файли" ви дізнаєтесь різницю між читанням файлу в режимі “binary” та “text”. Читання (та запис!) в текстовому режимі потребують параметру encoding. Деякі методи текстових файлів рахують символи, а інші рахують байти. Якщо ваш код спирається на те, що один символ == один байт, він зламається на багатобайтових символах.
- У розділі "Веб сервіси http" модуль httplib2 виокремлює заголовки та дані з http. Заголовки повертаються як рядки, а тіло http повертається у вигляді байтів.
- У розділі "Серіалізація об'єктів" ви дізнаєтесь, чому модуль pickle у Python 3 визначає новий формат даних, що є несумісним із Python 2. (Натякну: це через відмінності між bytes та strings). До того ж Python 3 підтримує серіалізацію об'єктів json, який взагалі не має bytes. Я покажу вам, як оминути це.
- У “Приклад: перенесення chardet на Python 3” просто кривава мішанина із bytes та strings.
Навіть якщо ви не турбуєтесь про Unicode (хоча доведеться), все одно мусите прочитати про форматування рядків у Python 3, яке цілковито відрізняється від тієї ж процедури у Python 2.
Ітератори містяться скрізь у Python 3, і зараз я знаю їх набагато краще, ніж п'ять років тому, коли писав “Занурення в Python”. Вам також треба розуміти їх, адже більшість функцій, які у Python 2 повертали списки, тепер повертають ітератори. Як мінімум, ви мусите прочитати другу половину розділу "Класи та ітератори" і другу половину розділу "Детальніше про ітератори".
За численними проханнями я додав розділ "Імена магічних методів", що схожий на розділ документації "Модель даних", тільки більш гумористичний.
Коли я писав “Занурення в Python”, усі доступні XML бібліотеки були справжнім лайном. Пізніше Фредрик Лунд (Fredrik Lundh) написав ElementTree, яка вже не була лайном. Боги Python мудро включили ElementTree до складу стандартної бібліотеки, і зараз вона стала основою для мого нового розділу "XML". Старі шляхи парсингу XML лишаються доступними, але їх слід уникати, адже вони — справжнє лайно!
Також нове в Python — але не у мові, а у спільноті — виникнення репозиторіїв, схожих на Python Package Index (PyPI). Python має утиліти для пакетування вашого коду в стандартних форматах і подальшого його розповсюдження через PyPI. Докладніше про це в розділі "Пакування бібліотек".