A sada nešto sasvim drugačije: Python 3000

Python

Nakon par godina razvoja, danas je napokon izašla finalna verzija Pythona 3k, nove grane u razvoju ovog odličnog programskog jezika.

Python 3k, odnosno sada i službeno Python 3.0, prekida kompatibilnost sa postojećim 2.x verzijama (trenutna verzija je 2.6). Kako svaka 2.x verzija ima garantiranu kompatibilnost sa prethodnim verzijama, tijekom godina razvoja jezika nakupljalo se sve više “smeća” kojeg je trebalo podržavati zbog te kompatibilnosti. Stoga Python 3.0 čini rez i popravlja stvari koje nije bilo moguće dirati u prethodnim verzijama.

Odmah da razuvjerim paničare: stvar nije kraj svijeta, neće se dogoditi nikakva apokalipsa, 2.6 će se i dalje paralelno razvijati još neko vrijeme, većinu novotarija jezika bilo je moguće uvjetno iskorsititi i u prethodnim verzijama pomoću from __future__ import trika, a dostupan je i službeni alat za poluautomatsku konverziju koda.

Promjene nisu revolucionarne i većinom se radi o brdu “sitnica”, nešto što početnik u jeziku ne bi niti primjetio. Osobno mislim da su sve promjene (za koje sam ja čuo – nisam baš išao čitati cijeli ChangeLog) na bolje i da je nova verzija konzistentnija, elegantnija i lakša za učenje i korištenje.

Novosti

Evo i nekih od bitnijih novosti u Pythonu 3k:

print() je od sada funkcija, a ne više naredba
U praksi to znači da oko argumenata po novom treba staviti zagrade. Kako su i sve ostale funkcije koje se bave čitanjem i pisanjem obične funkcije, ukidanje print naredbe povećava konzistentnost.
postoji samo jedan cjelobrojni tip, i on je int
Programeri više ne moraju razmišljati stane li broj u registre ili će možda biti veći. Jednostavno rade sa int-ovima a Python se brine o optimalnoj reprezentaciji podataka. (Ista je stvar i sa float vs. double – sada je samo jedan float tip koji po veličini odgovara IEEE double tipu)
svi stringovi su Unicode i moraju se eksplicitno prebacivati u ili iz nizova byteova
Uklanja jednu od bolnih točaka Pythona, unicode support. Python već duže vrijeme ima dobar Unicode support, ali je zbog automatske konverzije između starih str i unicode tipova često dolazilo do grešaka pa su programeri morali biti dobro svjesni svih zamki i zaobilaziti ih. Po novom postoje tipovi str koji predstavlja Unicode string te bytes niz byteova. Svaki put kad treba string zakodirati u nekom encodingu u niz byteova, ili ga dekodirati, potrebno je eksplicitno pozvati str.encode() odnosno bytes.decode().
Posljedica ovoga je i da je datoteke koje se žele koristiti za čitanje/pisanje tekstova potrebno otvoriti u text modu, a binarne u binarnom, čak i na Unix sustavima. To je stoga što je dosad otvaranje u tekst modu samo radilo konverziju CR-LF ukoliko je bila potrebna (na Windowsima), a odsad će raditi i enkodiranje/dekodiranje u Unicode za tekst datoteke.

razne funkcije za rad sa sekvencama podataka sad vraćaju iteratore
Funkcije poput range(), map(), filter(), dict.keys() i slično prije su vraćale gotove kreirane liste. No nad njima se u najvećem broju slučajeva samo iteriralo, pa je njihovo prethodno kompletno generiranje bilo trošak vremena i memorije. Nove inačice funkcija vraćaju iteratore, a ukoliko je baš potrebna lista, uvijek je moguće napraviti foo = list(...)
novi sustav za formatirane stringove
C-printf-oliki ‘%’ operater još uvijek je dostupan, ali se umjesto njega preporuča korištenje novog sustava za formatiranje, sličnog onom u C#-u, gdje se sa {} mogu koristiti pozicioni i keyword argumenti u format stringu
čišće iznimke
Sve iznimke sada naslijeđuju BaseException (nema više string exceptiona), za bacanje iznimke mora se koristiti raise Exception(*args) sintaksa (koja se mogla i u 2.x, no izbačena je zastarjela raise Exception, args.. sintaksa), a za hvatane iznimke mora se koristiti nova except Exception as foo umjesto stare except Exception, foo sintakse.

Prijeći ili pričekati?

Python 3.0 tek je izašao ispod čekića, tako da za njega još ne postoji brdo modula dok ih autori ne portaju, a i performanse su nešto lošije nego u 2.x verziji (naglasak je bio na popravcima, a tijekom životnog vijeka 3.x grane raditi će se na optimizacijama izvođenja).

Ukoliko započinjete novi projekt, a svi potrebni moduli su već dostupni, svakako odmah krenite sa
3.0. Ukoliko već imate dosta 2.x koda, koristite 2.6, uključite warninge za sve stvari koje su izmjenjene u 3.0 (postoji opcija za to, tako da možete vidjeti koliko ćete promjena trebati napraviti) i isprobajte 2to3 alat i uočite potencijalne probleme. Tijekom vremena malim izmjenama možete kod dovesti u stanje kad će ga biti lako prebaciti na verziju 3.x, a uz malo sreće taman će je do tad i nešto ubrzati kao i otkloniti eventualne dječje bolesti .0 verzije.

1 komentar(a)

  1. Sve 5. no to da je print postao funkcija, nikako nemogu oprostiti.
    print se ovako i onako kao takav ne bi trebao korisiti programu za išta, zato postoji logger, a uvuđeje 2 nova znaka samo otežava unos printa nečeg što se većinom koristi za brzi debuging.
    a za zagrade je poterebno još pritisuti shift.
    Ovo je teško probaviva stvar, kao da radim u java
    s System.out.printLn();