Стратегія відстеження змін у Python


16

Написання коду, який триватиме відтепер років

Змінюються мови програмування. Змінюються бібліотеки. Деякий код від 5, 10 або навіть 20 років тому все ще може працювати і давати очікувані результати, тоді як деякий код за 2 роки може вийти з ладу з синтаксичною помилкою. Частково це неминуче, оскільки мови розвиваються (принаймні, більшість). Розробники несуть відповідальність за збереження свого коду. Але іноді стабільність є важливою вимогою у виробничому коді, і код повинен просто працювати протягом 10 років, не вимагаючи того, щоб хтось перебирав код щороку, щоб адаптувати його до мовних змін. Або у мене можуть бути невеликі сценарії, наприклад, для наукового аналізу даних, які мені потрібно переглянути, після того, як їх не торкаються роками. Наприклад, у метеорологічних кабінетах є багато функціональних кодів Фортран навіть для нешвидкісних деталей, і стабільність коду є однією з причин. Я ' Ви чули, що страх перед нестабільністю є одним із об'єктів, які вони мають проти переходу на Python (окрім мовної інерції, звичайно, можливий лише новий код, не залежний від старого коду). Звичайно, одна стратегія стабільного коду - заморозити всю операційну систему. Але це не завжди можливо.

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

Документи з питань сумісності Python

У випадку з Python існує декілька документів, які окреслюють політику щодо невідповідних змін.

PEP-5

Відповідно до PEP 5 :

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

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

PEP 291

PEP 291 містить неповний перелік настанов речей, яких слід уникати, щоб зберегти відсталу сумісність. Однак це стосується лише Python 2.x. Оскільки Python 2.7 є остаточним випуском у серії 2.x, а Python 2.7 - лише виправлення, цей PEP зараз представляє лише історичний інтерес.

PEP 387

Існує також PEP 387 щодо невідповідних змін. PEP 387 - це проект, а не офіційна політика. У червні 2009 року це обговорювалося у списку розсилки Python-ідеї . Частина дискусії була присвячена тому, як розробники можуть писати код, який є надійним щодо мовних змін. В одному дописі були перелічені поради щодо того, що не робити :

Поряд з цим існує декілька правил, які ви можете зробити висновки, які, мабуть, вірні більшу частину часу: не називайте речі, починаючи з "_"цього, не мавпуйте нічого, не виправляйте нічого, не використовуйте динамічну заміну класів на об'єкти з інших класів, ніж ваш власний , не залежайте від глибини ієрархій успадкування (наприклад, ні ".__bases__[0].__bases__[0]"), переконайтеся, що ваші тести виконуються без створення будь-яких попереджувальних попереджень, пам’ятайте про можливі конфлікти в просторі імен, додаючи атрибути до класів, які успадковують з інших бібліотек. Я не думаю, що всі ці речі записані в одному місці.

Крім того, були деякі пункти щодо "шахтних полів" (нові можливості, можливо, зміниться) та "заморожених ділянок" (дуже продані API практично гарантовано не змінюються). Цитуючи Антуана Пітру :

Я думаю, що "заморожену область" слід визначати позитивно (явні публічні API та явно гарантована поведінка), а не негативно (явне "поле шахти"). Інакше ми забудемо помістити деякі важливі речі на мінне поле і пізніше покусаємо, коли нам потрібно змінити ці речі назад-несумісним способом.

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

Настанови щодо перенесення

Окрім вищезазначених документів, кожна версія Python має вказівки щодо перенесення : перенесення на Python 3.2 , перенесення на Python 3.3 тощо.

Корисна сумісність

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

З точки зору програмістів

Як програміст, я знаю, що Python зміниться в майбутньому і що люди - особливо я сам - спробують запустити мій код, можливо, через кілька років у версії Python, що становить одну, дві чи, можливо, три незначні версії. Не все буде сумісним, і насправді легко придумати код, який не вдасться (я колись стикався із зазначенням коду if sys.version[:3] != '2.3': print 'Wrong version, exiting'). Що я шукаю - це набір вказівок щодо того, що робити, а що не робити, щоб підвищити шанси на те, що мій код все ще залишиться незмінним у майбутньому.

Чи є такі настанови? Як написати код Python, який все ще буде працювати в майбутньому?

Моє питання відноситься як до ядра Python, в стандартній бібліотеці, а й часто використовувані додатки бібліотек, зокрема numpy, scipy, matplotlib.


EDIT : Поки дві відповіді стосуються python2 проти python3. Це я не маю на увазі. Я знаю про інструменти для міграції з Python2 на Python3. Моє запитання стосується мовних змін, які ще не відбудуться . Ми можемо зробити краще, ніж кришталевий куля, знайти більш стабільні вказівки щодо кодування. Наприклад:

  • import moduleє більш захищеним від майбутнього from module import *, тому що останній може порушити код, якщо moduleзростає одна чи кілька нових функцій / класів.

  • Використання незадокументованих методів може бути менш надійним у майбутньому, ніж використання документально підтверджених методів, оскільки щось без документації може бути ознакою того, що щось ще не є стабільним.

Саме такі практичні поради з кодування я дотримуюся. Оскільки мова йде про теперішнє → майбутнє, ми можемо обмежитися Python3, оскільки Python2 більше не збирається змінюватися.

Відповіді:


13

Це невирішена проблема в нашій галузі. Немає можливості бути впевненим, що ваш код буде працювати безкінечно. Навіть якщо ваш код був справді ідеальним у розумінні сумісного з форвардом (і якщо він є, будь ласка, працюйте в моїй компанії!;)), Якщо він працює, використовує або використовує будь-яке інше програмне забезпечення, яке отримує помилку або зміни в будь-якому випадку, ваш код може не працювати.

Тож я не можу дати вам список справ, які можна зробити, якщо ви будете слідувати їм, це гарантуватиме успіх. Але те, що ви можете зробити, це мінімізувати ризик майбутніх поломки та мінімізувати їх вплив. Більш обізнаний Pythonist міг би дати вам поради, більш конкретні для Python, тому мені доведеться бути більш загальним:

  • написати одиничні тести. Навіть для речей, які ви знаєте, їм не потрібні.

  • використання популярних / добре розроблених / стабільних бібліотек та технологій, уникаючи непопулярних (і, отже, швидше непідтримуваних)

  • уникайте написання коду, який використовує деталі реалізації. Код до інтерфейсів, а не реалізації. Код проти декількох реалізацій одного інтерфейсу. Наприклад, запустіть свій код у CPython, Jython та IronPython і подивіться, що відбувається. Це дасть вам чудові відгуки про ваш код. Це може бути не корисним для Python3, - останнє, що я чув, деякі реалізації все ще були в Python2.

  • написати простий, чіткий код, який є явним щодо його припущень

  • написати модульний, композиційний код. Якщо якийсь код повинен зробити щось небезпечне (у майбутньому захищеному сенсі), розділіть його так, що навіть якщо він повинен змінитися, решта коду не буде.

  • мають специфікацію якоїсь форми. Це схоже на пункти про одиничні тести, якщо ви використовуєте тести як специфікацію та інтерфейси, які також можна використовувати як специфікації. (Я маю на увазі інтерфейс у загальному розумінні, а не сенс ключового слова Java).

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

Чудово, що команда Python думає над цим, і напевно вони набагато талановитіші та кваліфікованіші, ніж я коли-небудь буду. І все-таки я вважаю, що на 100% існує те, що хтось код десь перестане працювати так, як планується, коли Python буде оновлений.


4

Це називається Управління конфігурацією. Якщо система ніколи не змінюється, вона не повинна ламатися. Тому не змінюйте систему. Турбуєтесь про нові випуски Python? Не оновлюйте. Турбуєтесь про нові драйвери пристроїв? Не оновлюйте. Турбуєтеся про патчі Windows? ...


0

Для Python 2 -> Python 3 вже встановлена бібліотека Python 2to3 (вона постачається з оригінальним пакетом Python).

Виходячи з цього, незабаром після виходу нових версій повинні бути подібні бібліотеки, які постачаються з кожною новою версією. Однак, як заявив Мартійн, такі бібліотеки будуть випущені лише для основних версій (наприклад, версії 3.0), але не для другорядних версій (наприклад, 3.2). Однак між 3.0 та 3.2 (або будь-якими іншими незначними версіями) проблем із сумісністю не повинно бути, тому перехід на версію 3.0 повинен бути нормальним.

Також пропоную поглянути на це питання .


1
Ні, 2to3 допомагає лише оновити код через основний розрив версії; не існує бібліотек (необхідних) для оновлення коду для другорядних версій.
Martijn Pieters

@MartijnPieters Незначні версії не повинні мати проблем із сумісністю, оскільки не повинно бути надмірно великих змін. Якщо є проблеми сумісності та великі зміни, слід випустити абсолютно нову версію.

0

У мене немає чого додати, "програма для 2 та використання 2to3", здається, є поширеним доповненням в Інтернеті останнім часом. Однак є щось, на що слід звернути увагу:

Це називається шість (pypi page) . Це бібліотека пітонів, присвячена допомозі в написанні коду, який працює як на python 2, так і на python 3. Я бачив, як він працював у ряді проектів, переглядаючи мережу, але на сьогоднішній день імена не вникають мені.


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