Pisanie kodu, który będzie działał za lata
Zmieniają się języki programowania. Biblioteki się zmieniają. Niektóre kody sprzed 5, 10, a nawet 20 lat temu mogą nadal działać i dawać oczekiwane wyniki, podczas gdy niektóre kody sprzed 2 lat mogą zawieść z błędem składni. Jest to częściowo nieuniknione, ponieważ języki ewoluują (przynajmniej większość tak robi). Programiści mają obowiązek utrzymywania swojego kodu. Czasami jednak stabilność jest ważnym wymogiem w kodzie produkcyjnym, a kod powinien po prostu działać przez 10 lat, bez potrzeby przeszukiwania kodu przez każdego roku w celu dostosowania go do zmian języka. Mogę też mieć małe skrypty, na przykład do analizy danych naukowych, do których muszę wrócić po nie dotykaniu ich przez lata. Na przykład w biurach meteorologicznych istnieje wiele działających kodów Fortran, nawet dla części nieistotnych z punktu widzenia prędkości, a stabilność kodu jest jednym z powodów. JA' słyszałem, że strach przed niestabilnością jest jednym z obiektów, które mają przeciwko przejściu na Python (oczywiście poza bezwładnością języka; jest to możliwe tylko w przypadku nowego kodu, który nie zależy od starego kodu). Oczywiście jedną ze strategii stabilnego kodu jest zamrożenie całego systemu operacyjnego. Ale nie zawsze jest to możliwe.
Używam Pythona jak na przykład, ale problem nie ogranicza się w szczególności do Pythona.
Dokumenty dotyczące problemów ze zgodnością w języku Python
W przypadku Pythona istnieje kilka dokumentów przedstawiających zasady dotyczące niezgodnych wstecz zmian.
PEP-5
Według PEP 5 :
Musi istnieć co najmniej roczny okres przejściowy między wydaniem przejściowej wersji Pythona a wydaniem wersji niezgodnej wstecz. Użytkownicy będą mieli co najmniej rok na przetestowanie swoich programów i migrację z przestarzałej konstrukcji na alternatywną.
Osobiście uważam, że jeden rok jest raczej krótki. Oznacza to, że mogę napisać kod, a za półtora roku nie będzie już działać.
PEP 291
PEP 291 zawiera niepełne listy wytycznych dotyczących rzeczy, których należy unikać, aby zachować kompatybilność wsteczną. Jednak dotyczy tylko Pythona 2.x. Ponieważ Python 2.7 jest ostatnim wydaniem z serii 2.x, a Python 2.7 zawiera wyłącznie poprawki błędów, ten PEP ma teraz tylko znaczenie historyczne.
PEP 387
Istnieje również PEP 387 na temat niezgodnych wstecz wersji. PEP 387 to projekt, a nie oficjalna polityka. W czerwcu 2009 r. Zostało to omówione na liście dyskusyjnej Python-ideas . Część dyskusji skupiła się na tym, jak programiści mogą pisać kod odporny na zmiany językowe. W jednym poście wymieniono porady dotyczące tego, czego nie należy robić :
Oprócz tego istnieje kilka zasad, które można wywnioskować, które są prawdopodobnie prawdziwe przez większość czasu: nie wywoływaj rzeczy zaczynając od
"_"
, nie małpuj niczego, nie używaj dynamicznej zamiany klas na obiekty z klas innych niż twoje własne , nie zależą od głębokości hierarchii dziedziczenia (na przykład nie".__bases__[0].__bases__[0]"
), upewnij się, że testy przebiegają bez generowania DeprecationWarnings, pamiętaj o potencjalnych konfliktach przestrzeni nazw, dodając atrybuty do klas dziedziczących z innych bibliotek. Nie sądzę jednak, aby wszystkie te rzeczy były zapisane w jednym miejscu.
Ponadto pojawiły się pewne uwagi na temat „pól minowych” (nowe funkcje mogą ulec zmianie) i „zamrożonych obszarów” (bardzo sprzedawane interfejsy API praktycznie nie ulegają zmianie). Cytując Antoine Pitrou :
Myślę, że „zamrożony obszar” powinien być zdefiniowany raczej pozytywnie (jawne publiczne interfejsy API i wyraźnie gwarantowane zachowanie), a nie negatywnie (wyraźne „pole minowe”). W przeciwnym razie zapomnimy umieścić kilka ważnych rzeczy na polu minowym i ugryziemy się później, gdy będziemy musieli zmienić te rzeczy w sposób niezgodny wstecz.
Wydaje się, że nie ma żadnych wniosków z tego wątku, ale zbliża się do sedna tego, czego szukam. Wątek ma prawie cztery lata, więc być może sytuacja się zmieniła lub poprawiła. Jaki kod prawdopodobnie przetrwa i jaki kod jest bardziej delikatny?
Wytyczne dotyczące przenoszenia
Oprócz dokumentów opisanych powyżej, każda wersja Pythona zawiera wytyczne dotyczące przenoszenia : przenoszenie do Python 3.2 , przenoszenie do Python 3.3 itp.
Przydatna kompatybilność
PEP 3151 wprowadził mnie do koncepcji użytecznej kompatybilności . Moim zdaniem sprowadza się to do idei, że tylko jeśli kod jest starannie napisany, programiści muszą zachować ostrożność, aby zachować zgodność. Tak naprawdę nie definiuje użytecznej kompatybilności , ale myślę, że jest podobny do pomysłów cytowanych w dyskusji PEP 387 powyżej.
Z punktu widzenia programistów
Jako programista wiem, że Python zmieni się w przyszłości i że ludzie - przede wszystkim ja - będą próbowali uruchomić mój kod, może za kilka lat, w wersji Python, która ma jedną, dwie, a może trzy mniejsze wersje. Nie wszystko będzie kompatybilne, a tak naprawdę łatwo jest wymyślić kod, który zawiedzie (kiedyś spotkałem się z kodowaniem if sys.version[:3] != '2.3': print 'Wrong version, exiting'
). To, czego szukam, to zestaw wskazówek, co robić, a czego nie robić, aby zwiększyć szanse, że mój kod będzie nadal działał bez zmian w przyszłości.
Czy są jakieś takie wytyczne? Jak napisać kod Pythona, który będzie nadal działał w przyszłości?
Moje pytanie odnosi się zarówno do rdzenia Python, do jego biblioteki standardowej, ale także powszechnie używany dodatek bibliotek, w szczególności numpy
, scipy
, matplotlib
.
EDYCJA : Jak dotąd dwie odpowiedzi dotyczą python2 vs. python3. Nie o to mi chodzi. Wiem o narzędziach do migracji z Python2 do Python3. Moje pytanie dotyczy zmian językowych, które mają nadejść . Możemy zrobić coś lepszego niż kryształowa kula , znajdując bardziej stabilne wytyczne kodowania. Na przykład:
import module
jest bardziej przyszłościowy niżfrom module import *
, ponieważ ten ostatni może złamać kod, jeślimodule
wyhoduje jedną lub więcej nowych funkcji / klas.Używanie nieudokumentowanych metod może być mniej przyszłościowe niż stosowanie udokumentowanych metod, ponieważ coś nieudokumentowanego może świadczyć o tym, że coś nie jest jeszcze stabilne.
To tego rodzaju praktyczne porady dotyczące kodowania, których szukam. Ponieważ chodzi o teraźniejszość → przyszłość, możemy ograniczyć się do Python3, ponieważ Python2 już się nie zmieni.
Nie mam wiele do dodania, „program dla 2 i używaj 2to3” wydaje się ostatnio być popularnym dodatkiem w Internecie. Jest jednak coś, na co powinieneś spojrzeć:
Nazywa się sześć (strona pypi) . Jest to biblioteka Pythona poświęcona pomocy w pisaniu kodu, który działa zarówno na Pythonie 2, jak i Pythonie 3. Widziałem, że jest on wykorzystywany w wielu projektach podczas przeglądania sieci, ale w tej chwili nazwy mi uciekają.
źródło