Trzeci Python
-
- 16.12.2008
Bardzo popularny język programowania Python, razem z wersją 3, został mocno zmieniony. Jest to pierwsza zmiana w historii projektu, która łamie zasadę zgodności wstecz.
Bardzo popularny język programowania Python, razem z wersją 3, został mocno zmieniony. Jest to pierwsza zmiana w historii projektu, która łamie zasadę zgodności wstecz.
Stworzony w 1990 r. Python jest interpretowanym językiem programowania, który - podobnie jak C++ - nie wymusza jednego stylu programowania. Możliwe jest programowanie obiektowe, strukturalne i funkcyjne. Język ten posiada też dynamiczny system typów (podobnie jak w językach Tcl, Perl, Scheme czy Ruby) i automatyczne zarządzanie pamięcią za pomocą garbage collection. Python rozwijany jest w modelu open source i zarządzany przez Python Software Foundation.
Nowy wąż
Standardową implementacją języka Python jest tzw. CPython (pisany w C), ale istnieje też implementacja w języku Java (Jython), dla plarformy .NET (IronPython), a nawet napisana w Pythonie (PyPy). W tym języku są pisane różne programy, od prostych skryptów po całe pakiety (choćby MailMan, brazylijski program ERP Stoq czy serwer Zope). Obok języków Perl i PHP, Python często gra rolę składnika popularnego stosu LAMP (Linux, Apache, MySQL) w wielu firmach związanych z Web 2.0, takich jak YouTube, Flickr, Digg czy deli.cio.us.
Python od wersji 3.0 zrywa jednak z niektórymi, dotychczasowymi praktykami programistycznymi. Celem zmian było usunięcie niedogodności przeszkadzających w programowaniu. Modyfikacje są dość znaczne, od popularnej instrukcji print, poprzez zmiany w składni, aż po zasady obsługi danych kodowanych w Unicode. Aby ułatwić pracę deweloperom dużych projektów, przygotowano specjalne narzędzie o nazwie 2to3, które ułatwia konwersję kodu programu pomiędzy wersjami.
Lista nowości
Dawna instrukcja print jest teraz funkcją (wywoływaną przez print()). Oprócz innego wywołania, można zdefiniować znak separatora. Narzędzie 2to3 dokonuje automatycznie odpowiednich zmian podczas konwersji kodu do nowej wersji. Z kolei zamiast list dostępne są widoki oraz iteratory. Przykładowo dict.keys() zwraca widok, zatem zamiast k = d.keys(); k.sort() należy użyć k = sorted(d). Podobnie map() zwraca iterator, więc do uzyskania listy można użyć (list(map(..)), ale lepszym rozwiązaniem będzie przepisanie kodu, tak by lista nie była potrzebna w ogóle. W dokumentacji są dobre przykłady, warto z nich skorzystać. Uproszczono też działanie operatorów porównania, wymuszając działanie tylko dla tych wartości, których porównywanie ma sens. Przykładowo wyrażenie 0 > None jest nieprawidłowe w myśl nowych reguł, None < None także zwraca błąd TypeError zamiast wartości fałsz (jak w wersji 2.x). Te zasady nie dotyczą operatorów porównania == oraz != , wartości różnych nieporównywalnych typów są zawsze różne.
Najpoważniejsze zmiany dotyczą sposobu traktowania danych binarnych i formatu Unicode. W nowej wersji używa się text oraz binary zamiast łańcuchów Unicode i ośmiobitowych. Tekst jest rozumiany jako Unicode, ale enkodowana zawartość Unicode jest reprezentowana jako dane binarne. Do obsługi tekstu używa się str, typem dla danych jest bytes. Najważniejsza różnica pomiędzy wersjami Pythona polega na tym, że obecnie każda próba mieszania tekstu i danych bez konwersji powoduje błąd TypeError. W poprzednich wersjach można było mieszać Unicode i łańcuchy 8-bit, jeśli tylko zawierały one znaki z podzbioru siedmiobitowego. W przeciwnym przypadku otrzymywano błąd UnicodeDecodeError. Zależność poprawnej pracy od tego, czy zawartość należy do pewnego podzbioru dopuszczalnych wartości była określana jako błąd.
Pliki otwierane jako tekstowe (nadal jest to opcja domyślna dla open()), zawsze podlegają enkodowaniu pomiędzy string (w pamięci) i bytes (na dysku). Pliki binarne (otwierane z parametrem b) zawsze używają bytes w pamięci. Zatem przy otwarciu pliku w niewłaściwym trybie lub enkodowaniu, proces transferu danych najpewniej zgłosi błąd, zamiast po cichu produkować nieprawidłowe dane. Z tego wynika także to, że nawet użytkownicy systemów typu UNIX, muszą określić właściwy tryb otwierania pliku.
Zmiana dotyczy także formatu danych używanych jako nazwy plików przy pobieraniu i zwracaniu za pomocą API. Od teraz jest to wyłącznie Unicode, co może powodować pewne problemy w niektórych platformach bez zmiany kodu. Oprócz nazw plików, zmiany związane z obsługą znaków spoza ASCII objęły nawet kod źródłowy oraz identyfikatory. Od teraz można korzystać ze znaków spoza ASCII w nazwach oraz identyfikatorach, chociaż standardowa biblioteka nadal jest siedmiobitowa, z wyjątkiem nazwisk autorów w komentarzach.
Nawet składnia języka Python uległa zmianie, szczegóły są dostępne w dokumentacji języka. Niestety najnowsza wersja jest jeszcze mało wydajna (nawet do 10-12% mniej w stosunku do wersji 2.5). Niedogodność ta ma jednak zostać usunięta.