Чому люди вагаються з використанням Python 3?


221

Python 3 був випущений у грудні 2008 р. З тих пір минуло багато часу, але досі багато розробників вагаються з використанням Python 3. Навіть такі популярні фреймворки, як Django, ще не сумісні з Python 3, але все ще покладаються на Python 2.

Звичайно, Python 3 має деякі несумісності з Python 2, і деяким людям потрібно покладатися на зворотні сумісність. Але хіба Python 3 не був достатньо довгим, щоб більшість проектів перемикалися або починалися з Python 3?

Наявність двох конкуруючих версій має стільки недоліків; необхідно підтримувати дві гілки, плутанина для учнів тощо. То чому ж так багато вагань у всій спільноті Python щодо переходу на Python 3?


3
Чи справді так багато нових проектів, які починають використовувати Python 2? Або це просто давно налагоджені проекти на зразок Джанго?
Carson63000

3
Чи можете ви навести деякі дискусії / джерела?
Михайло Пасха

12
@Michael Easter - Йому не доведеться. Просто перевірте тег python на SO; багато людей там думки "навчись 2.x, 3.x ще не готовий".
Грак

5
Ви не бачили стіни сорому Python 3 ?
detly

7
@detly, зараз це заклик Python 3 Wall of Superpower
freeforall tousez

Відповіді:


249

Зауважте, що я більше не оновлюю цю відповідь. У мене набагато довше питання і відповіді на Python 3 на особистому веб-сайті http://python-notes.curiousefficiency.org/en/latest/python3/questions_and_answers.html

Попередня відповідь:

(Оновлення статусу, вересень 2012 р.)

Ми (тобто розробники ядра Python) передбачили, коли Python 3.0 вийде, що піде приблизно 5 років, щоб 3.x став вибором "за замовчуванням" для нових проектів протягом серії 2.x. Це прогноз, чому запланований період технічного обслуговування для випуску 2,7 настільки довгий.

Оригінальний випуск Python 3.0 також виявив деякі критичні проблеми з низькою продуктивністю вводу-виводу, що зробило його практично непридатним для використання в більшості практичних цілей, тому більш доцільним є запуск часової шкали з виходу Python 3.1 наприкінці червня 2009 року. Проблеми з роботою IO також є причиною того, що немає версій технічного обслуговування 3.0.z: немає жодної вагомої причини, коли хтось не захоче дотримуватися версії 3.0 над оновленням до 3.1).

На момент написання (вересень 2012 р.) Це означає, що ми зараз трохи більше 3 років переходимо до процесу переходу, і це прогноз все ще здається на шляху.

Хоча люди, які набирають код Python 3, найчастіше кусаються за допомогою синтаксичних змін, таких як printперетворення на функцію, що насправді не є клопотом для перенесення бібліотеки, оскільки автоматизований 2to3інструмент перетворення обробляє це досить щасливо.

Найбільшою проблемою на практиці є насправді семантична проблема: Python 3 не дозволяє вам швидко і вільно грати з текстовими кодуваннями, як це робить Python 2. Це і найбільша перевага для Python 2, але і найбільший бар'єр для перенесення: вам потрібно виправити проблеми з обробкою Unicode, щоб порт працював правильно (тоді як у 2.x багато цього коду мовчки видавали невірні дані з не вхідні дані ASCII, що створює враження роботи, особливо в умовах, коли дані, що не належать до ASCII, є рідкістю).

Навіть у стандартній бібліотеці в Python 3.0 та 3.1 все ще виникали проблеми з обробкою Unicode, що ускладнює перенесення багатьох бібліотек (особливо тих, що стосуються веб-служб).

3.2 вирішено багато таких проблем, забезпечуючи набагато кращу ціль для бібліотек та рамок, таких як Django. 3.2 також представлена ​​перша робоча версія wsgiref(основний стандарт, що використовується для зв'язку між веб-серверами та веб-додатками, написаними на Python) для 3.x, що було необхідною умовою для прийняття у веб-просторі.

Основна залежність , як NumPy і SciPy тепер було перенесено, установка і управління залежностями інструменти , такі як zc.buildout, pipі virtualenvдоступні для 3.x, реліз Pyramid 1.3 підтримує Python 3.2, майбутня Джанго 1,5 релізу включає в себе експериментальну підтримку Python 3, і випуску 12,0 Система Twisted Networks знизила підтримку Python 2.5, щоб прокласти шлях для створення сумісної версії Python 3.

На додаток до прогресу бібліотек та фреймворків сумісності Python 3, популярна реалізація інтерпретатора PyPy, складеного JIT, активно працює над підтримкою Python 3.

Інструменти управління процесом міграції також помітно покращилися. На додаток до 2to3інструменту, що надається у складі CPython (який зараз вважається найкращим для одноразових перетворень програм, яким не потрібно підтримувати підтримку серії 2.x), є також python-modernize, який використовує 2to3інфраструктуру для націлювання (великий) загальний підмножина Python 2 та Python 3. Цей інструмент створює єдину базу коду, яка працюватиме як на Python 2.6+, так і на Python 3.2+ за допомогою sixбібліотеки сумісності. Випуск Python 3.3 також усуває одну з основних причин "шуму" під час міграції існуючих програм, які знають Unicode: Python 3.3 ще раз підтримує префікс 'u' для рядкових літералів (він насправді не робитьщо - небудь в Python 3 - це тільки що було відновлено , щоб уникнути випадкового внесення переходу на Python 3 важче для користувачів , які вже правильно відзначилися їх текст і бінарні літерали в Python 2).

Таким чином, ми насправді дуже задоволені тим, як все прогресує - ще є майже два роки, щоб продовжити свій початковий часовий проміжок, і зміни непогано прорізаються через всю екосистему Python.

Оскільки багато проектів не виліковують метадані Python Package Index належним чином, а деякі проекти з менш активним обслуговуючим персоналом отримали можливість додавати підтримку Python 3, чисто автоматизовані сканери PyPI все ще надають надто негативне уявлення про стан бібліотеки Python 3 підтримка.

Кращою альтернативою для отримання інформації про рівень підтримки Python 3 на PyPI є http://py3ksupport.appspot.com/

Цей список особисто підготовлений Бреттом Кенноном (давнім розробником ядра Python) для обліку невірних метаданих проекту, підтримка Python 3, що знаходиться в інструментах контролю джерел, але ще не є офіційним випуском, та проекти, які мають більш сучасні вилки або альтернативи, що підтримують Python 3. У багатьох випадках у бібліотеках, які ще не доступні на Python 3, відсутні ключові залежності та / або відсутність підтримки Python 3 в інших проектах зменшується попит користувачів (наприклад, коли основна рамка Django буде доступна на Python 3, пов'язані такі інструменти, як South та django-celery, швидше додають підтримку Python 3, а наявність підтримки Python 3 і в Pyramid, і в Django робить більш ймовірним, що підтримка Python 3 буде реалізована в інших інструментах, таких як gevent).

Сайт на веб- сайті http://getpython3.com/ включає в себе чудові посилання на книги та інші ресурси для Python 3, визначає деякі ключові бібліотеки та рамки, які вже підтримують Python 3, а також надає деяку інформацію про те, як розробники можуть звернутися за фінансовою допомогою до PSF при перенесенні ключових проектів на Python 3.

Ще один хороший ресурс - сторінка вікі спільноти про фактори, які слід враховувати при виборі версії Python для нового проекту: http://wiki.python.org/moin/Python2orPython3


3
Оновлено на основі прогресу за останні 18 місяців (і чітко відзначив той факт, що 3.1 був першим реальним випуском 3.x випуску завдяки
ненормальній

1
До певної міри (тобто ми знали, що це значно повільніше, ніж підсистема io в 2.6), але вплив на загальну зручність використання набагато гірший, ніж ми очікували (наші показники введення-виведення помітно покращилися відтоді, тому немає шансів, що щось подібне буде відправляється сьогодні)
ncoghlan

6
Запропоновані часові рамки не здаються настільки захопленими зараз у 2015 році: |
зета

1
Я бачу це (і мене за це певні спалять на вогні) - це те, що на фронті кодування Py3 порушив (і все ще робить, як це діється) дзен Python в пункті "прагматизм б'є чистоту" : Py3 - кодування. Py2 був кодуючо-прагматичним.
Юрген А. Ерхард

2
Py3 досі прагматичний щодо кодування (інакше у нас не було б сурогатного пейзажу), ми просто стикаємося з багатьма користувачами * nix, які не зацікавлені почути про те, як інтерфейси операційної системи працюють на таких платформах, як Windows, .NET та JVM ( включаючи Android). Про це я писав більше на developerblog.redhat.com/2014/09/09/… Основний вплив було на фронт "помилки не повинні проходити мовчки", оскільки ми змінили помилки, залежні від даних, які призвели до mojibake на помилки структурного типу скарги на змішування бінарних даних та текстових даних.
ncoghlan

48

Я вважаю, що багато вагань випливає з двох речей:

  • Якщо він не зламався, не виправляйте
  • [Бібліотека XYZ], для якої нам потрібна, не має порту 3.0

Існує досить багато відмінностей у поведінці основної мови, викладених у цьому документі . Щось так просто, як, наприклад, зміна "друку" з оператора на функцію, наприклад, зламає багато Python 2.x-коду - і це лише найпростіше. Вони позбулися класів старшого стилю повністю в 3.0. Насправді вони є зовсім різними мовами - тому перенесення старого коду не настільки просто, як можна вважати.


2
Проблема залежності-не-має-порт також є рекурсивною. Що потрібно для широко використовуваних бібліотек, які мають мало або взагалі не залежать від stdlib до порту, які можуть запустити ланцюгову реакцію.
Тоні Мейєр

10
Я переключив би замовлення. Багато з нас крокують навколо, чекаючи переходу певного пакету до 3.
С.Лотт

1
@Tony - саме тому я вважаю, що для 3.0 є чудовим благом, що Numpy тепер доступний для нього. @ S.Lott - Я думаю, це дійсно залежить від того, якщо 3 пропонують щось, що ти хочеш. Якщо чесно, то я зовсім недавно перейшов з 2,5 до 2,7 - тому я насправді не з тих людей, хто слідкує за "останнім і найбільшим".
TZHX

1
Перенесення старого коду за допомогою 2to3не так важко, як деякі люди бояться, хоча.
ncoghlan

5
Це не допомагає, що майже кожна ОС, яка вбудовує Python у дистрибутив (OSX, Linux тощо), все ще застрягла у стародавній версії Python 2. Навіщо писати для Python 3, коли ніхто не може використовувати ваш код, не замислюючись про з внутрішніми місцями своєї ОС?
Мурашка

28

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

Крім того, після міграції, що забезпечує відсутність регресу, і головний біль неминучий.

Для нових проектів політика є простою і простою, вона починається з таких пунктів:

  1. Чи є якийсь дистрибутив, наприклад, Ubuntu судно Python 3 у встановленій ними програмі?
  2. Яка екосистема бібліотеки для Python 3.
  3. Чи всі рамки та інші сумісні з Python 3. і т. Д. І т.д.

Це ваш звичайний процес "вибору нової мови". Ось звідки виникає проблема з курячим яйцем. Не багато людей використовують її, тому що не багато людей її використовують. Зрештою ніхто взагалі не відчуває, як рухатися до цього.

Порушення сумісності ззаду ніколи не було хорошою справою, в кінці кінців ви завжди закінчуєте хороший відсоток користувачів.


14

Приблизно з моменту виходу Python 2.0, Python стрімко зростає популярністю. Було багато нових користувачів, які природно використовували останню версію, оскільки вони не мали залежності від старих версій. Коли багато людей за замовчуванням приймали версію 2.0, на розробників бібліотек був великий тиск тощо.

На момент виходу Python 3.0 вже існувало величезна кількість користувачів, залежних від Python 2.0, і експоненціальне зростання (зберігаючи постійний коефіцієнт відносно існуючих користувачів), очевидно, не може бути збережене безстроково.

Особисто нові функції ще за 2 дні Python здалися набагато переконливішими, ніж ті, які надає Python 3.

Раніше я думав, що Python 3 врешті-решт перейме на себе, але зараз я не такий впевнений. Але це не лише Python. Зрештою, скільки людей чесно використовують Perl 6? Це було досить довше, ніж Python 3, IIRC.


3
Чорт, я все ще використовую Fortran77. :) І більшість справжніх "функцій" з Python 3 були підкріплені в 2.6 та 2.7, без такої кількості проблем із сумісністю. Єдине, що насправді пропонує Python 3 - це синтаксис "чистішого".
TZHX

3
Порівнювати Python 3 та Perl 6 - неправильно. Python 3 - поступовий стрибок з Python 2, тоді як Perl 6 - це загальний перероблений проект. Perl 5 і Perl 6 є побратимами і будуть існувати ще довго. З іншого боку, Python 3 планує замінити Python 2, а не просто спільно існувати. Це велика різниця.
kamaal

1
Perl 6 ще знаходиться на стадії розробки. Так, Rakudo Perl є найбільш близькою реалізацією до специфікації Perl 6, але ще не реалізує все. Просто ще немає виробництва, готового до реалізації Perl 6.
Htbaa

1
@Htbaa для багатьох визначень повноти та готовності. Perl 6 готовий і виробництво готове. Справа в тому, що це може зайняти деякий час, щоб відповідати повній специфікації, є подібні речі і з іншими мовами. Наприклад, GCC навіть до недавнього часу не зовсім відповідав всій специфікації C ++. Розробка та реалізація мови - дуже повільний процес.
kamaal

1
rakudo.org/node/75 Ракудо зірка була звільнена довго. Вам потрібно спробувати.
kamaal

11

Велике стоп-шоу для мене, яке, я думаю, не може бути вирішене автоматичним перекладом, - це ціле поділ. У мене є наукові коди, які покладаються на x / 2, що дає x округлий вниз (коли x ціле число).

Python 3 цього не зробив, але дав би відповідь .5 (для непарного x).
Я не можу просто замінити всі / у своєму коді на // тому, що іноді я плаваю поділом, і так хочеться поведінки з плаваючою функцією.

Отже, для того, щоб я перейшов на python 3, мені доведеться пролізти через десятки тисяч рядків коду, перевіряючи кожну / та бачу, чи зможу я зрозуміти, чи має бути / чи //.


7
Варіант "-Q" (від 2,2 до 2,7) може викликати попередження про поділ. Також fixdiv.py використовує ці попередження для оновлення виразів у ваших сценаріях.
Ерік Нд

10

Python 3 приємно розпочати новий проект, якщо всі потрібні вам бібліотеки вже перенесені на Py3k.

Якщо це не варіант, використання Python 2.7 є найкращим з обох світів: у вас є більшість кожної бібліотеки, створеної для Python 2.x, і ви можете поступово змінювати свій код, щоб бути сумісним з Py3k, щоб міграція була легкою, коли ви вирішили це. Список синтаксичних смаколиків з Py3k, який ви вже маєте в 2.7, досить довгий, просто не забудьте імпортувати з __future__. Мої фаворити - Unicode за замовчуванням, і поділ завжди створює поплавок.


10

З точки зору веб-служб: Жодна з основних серверних рамок або веб-фреймів не підтримує Python3.

Оновлення: Очевидно, що так було на початку 2011 року, на сьогодні (наприкінці 2013 року) більшість основних фреймворків працюють з Python3. Однак деякі досі не сумісні. Вагомим прикладом може бути «Скручений», де він ще працює .


До речі, Django тільки почав експериментально підтримувати Python3, в версії 1.5.
9000

1
Django 1.6 тепер офіційно підтримує Python 3. Flask також підтримує його.
chhantyal

8

Я не бачив переконливих причин використовувати P3K, якщо ви не виконуєте важких робіт з i18n. У моїх обшуках я виявив, що широко розповсюджений Unicode є перешкодою для моєї роботи (ASCII) та обов'язкових генераторів, що засмічують мій код.

Через кілька років 3 представлять більш вигідне середовище, але не сьогодні.


4

Розповсюдження не робить Python3 доступним. Існують деякі дистрибутивні бахроми, які вже переходять з Python2. Але основні варіанти Linux, такі як Debian, Ubuntu тощо. Це головна причина для мене, як автора програми, цього не робити.

Хоча я підготував перехід і навіть намагаюся уникнути синтаксичних конструкцій, які були несумісні , я не можу належним чином перевірити його. Це дійсно зводиться до проблеми з куркою та яйцями.


4
Це, можливо, колись було правдою, але "apt-get install python3" та "yum install python3" працювали давно. Інструменти, такі як токсичні послуги та такі послуги, як Shining Panda CI, дозволяють випробовувати декілька версій Python.
ncoghlan

Зараз багато з цих дистрибутивів встановлюють python3 за замовчуванням, на відміну від багатьох інших мов програмування.
Антті Хаапала
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.