Přes deset let jsem se živil programováním v PHP. Poslední rok jsem ale přesedlal na Python. Jaké má Python oproti PHP výhody a jaké slabiny?
Syntaxe
Hlavní výhodu Pythonu oproti PHP (a dalším Cčkovým jazykům) vidím v jeho velmi čisté a obrovsky expresivní syntaxi.
Na ukázku přikládám obrázky s pár srovnáními: práce s poli, čtení souboru s pomocí context manageru, předávání parametrů (keyword parametry, různý počet parametrů), property a deskriptory.
Python umožňuje i další věci, pro které se ale v PHP těžko hledá alternativa. Např. meta třídy nebo dekorátory:
import time
def timeit(f):
def wrapper(*args, **kwargs):
start = time.time()
res = f(*args, **kwargs)
end = time.time()
print('Elapsed time for {} is {}s'.format(
f,
end - start
))
return res
return wrapper
@timeit # dekorátor
def hello():
time.sleep(1)
print('Hello!')
hello()
Dekorátory jsou vlastně jen syntaktický cukr pro zápis "hello = timeit(hello)", jsou ale velmi užitečné. V uvedeném příkladu pomocí přidání dekorátoru timeit na funkci hello mohu
změřit jak dlouho trvá vykonávání funkce hello. Dekorátory se používají na cachování, kontrolu práv, registraci callbacků apod.
Pro hodně lidí je těžko zkousnutelné, že v Pythonu odsazování kódu nese význam.
Zpočátku jsem měl také obavy, jestli chybějící složené závorky nezhorší čitelnost kódu,
ale ukázaly se jako plané.
Složené závorky jsou vlastně nadbytečná informace, protože každý příčetný programátor tak jako tak kód podle zanoření kód i odsazuje.
Standardní knihovna
Standardní knihovna Pythonu má oproti PHP jednu velkou výhodu - je rozdělená do cca 200 modulů.
To přispívá k daleko lepší orientace v knihovně.
Interpretr pythonu také načítá do paměti jen ty knihovny, které opravdu chceme, a pravděpodobně i díky tomu má menší paměťový otisk (8,5MB) než PHP (22,5M).
Vzhledem ke své víceúčelovosti má Pythonní knihovna také o něco širší záběr a najdeme tu tak i třeba moduly pro komunikaci s cizími C knihovnami, na tvorbu konzolových aplikací (curses), práci s multimédii, nebo na asynchronní IO, o kterém jsem psal minule.
Konzole
Jako velkou výhodou Pythonu oproti PHP vnímám jeho interaktivní konzoli.
Není potřeba psát echo pro vypsání výsledku, případný výsledek příkazu se vypíše automaticky:
>>> 1 + 2 + 3
6
Pokud se do konzole vypíše nějaká datová struktura složená ze základních typů,
je výpis validním python kódem. Můžeme ho tedy zkopírovat a hned použít:
>>> {x: x**2 for x in range(1, 5)}
{1: 1, 2: 4, 3: 9, 4: 16}
Kromě konzole dodávané přímo v distribuci pythonu exisují i další konzole, které nabízejí různé pokročilé funkce, např. obarvování kódu, napovídání (viz obrázky), benchmarking, prezentační mód apod.
Víceúčelovost
PHP vzniklo jako skriptovací jazyk na oživení webových stránek.
Od té doby ušlo velmi dlouhou cestu, ale mimo svět webu se nikdy moc nerozšířilo.
Oproti tomu Python byl od počátku navrhován jako obecný skriptovací jazyk a dnes se kromě webu prosazuje i v oblastech zpracování velkých dat,
strojového učení nebo při vývoji operačních systémů.
Komunita
Ve světe PHP jsem se v ČR vlastně nikdy nesetkal s nějakou komunitou kolem jazyka,
existuje pouze komunita okolo Nette.
Python mají vývojáři asi celkově víc rádi a tak u nás existují pravidelné PyVo srazy a za měsíc bude v Brně dokonce celá konference věnována Pythonu - PyCon CZ.
Měl jsem to štěstí se v létě zúčastnit konference EuroPython ve španělském Bilbau a celkový pocit z přednášek, lidí a směřování celé platformy byl velmi pozitivní, což se například po přednášce zakladatele PHP Rasmuse Lerdorfa na WebExpu rozhodně říct nedalo :)
Nedostatky Pythonu
Abych pouze nechválil, existuje i pár věcí, kde si myslím, že Python za PHP pokulhává.
Prvním nedostatkem je způsob práce se jmennými prostory.
V PHP se používá klíčové slovo namespace, pomocí kterého si můžete projekt libovolně
rozdělit do jmených prostorů.
V Pythonu rozdělení do jmenných prostorů odpovídá souborům a složkám, což je sice pohodlné, ale může být občas omezující a svádět k vytváření příliš dlouhých souborů.
Dalším velkým nedostatkem byla chybějící volitelná typovost parametrů (v PHP type hinty), která byla přidána až do verze 3.5.
V PHP díky type hintům existují pokročilé Dependency injection kontejnery, které fungují poloautomaticky. Ve světě Pythonu se obecně technika Dependency injection příliš nepoužívá, což je možná škoda.
Závěrem
PHP je dobrý jazyk, který má ale z mého pohledu už zastaralou Céčkovou syntaxi a chaotickou standardní knihovnu.
Python je velmi příjemný a intuitivní jazyk na čtení i psaní, který přestože je o 4 roky starší než PHP, tak působí mnohem moderněji.
Zpětně jsem tak za své rozhodnutí začít pracovat v Pythonu velmi rád.
Jak se v pythonu bezne resi predavani zavislosti?