přihlásit 4747/544801

Syntaxe

Všechno by mělo být uděláno tak jednoduše, jak jen to jde. Ne však jednodušeji.

Albert Einstein

Tvůrci Pythonu považují syntaxi za velmi důležitou a je ve středu jejich zájmu. Jejich cílem je jednoduchá, přehledná a snadno srozumitelná syntaxe, která poskytuje co nejméně příležitostí k chybám. Původně byla syntaxe Pythonu tak jednoduchá (rozuměj primitivní), až byla těžkopádná a měl jsem vůči ní výhrady. Asi jsem nebyl sám, takže postupem času došlo k zavedení prvků, které jsou sice duplicitní (z jistého pohledu tedy zbytečné a matoucí), ale zkracují a zpřehledňují zápis a nevedou k chybám. Krásný příklad je například zvětšení hodnoty proměnné o jedna. Původně bylo možné použít jen zápis:

prom = prom + 1
Dnes už jde použít i běžná zkrácená forma zápisu:
prom += 1

Stále ale nejde použít inkrementátor, tedy něco jako prom++ nebo ++prom a to právě proto, že začátečníky pre a postfixový inkrementátor mate, a při jeho používání dělají chyby.

Dnes mi přijde syntaxe Pythonu dobře vyvážená a plnící určené cíle.

Prvním znakem syntaxe Pythonu je přímočarost.

Jednoduché věci se dělají jednoduše. Například načtení obsahu souboru do proměnné lze udělat takto snadno:

obsah = open("soubor.txt").read()

To je celé. Taková přímočarost vede ke krátkému kódu. Krátký kód je přehledný a snadno pochopitelný. Snáz se udržuje a je v něm méně chyb. Toto neplatí absolutně. Kód lze zkracovat různými způsoby a některé z těchto způsobů vedou k nepřehlednému kódu, které dosažené zkrácení nevyváží. To je problém třeba jazyka Perl. U Pythonu je prioritní přehlednost, takže se kód nezkracuje za každou cenu. Nežádoucí techniky stejně spíše zkracují délku zápisu místo omezení počtu příkazů a řádků, což je důležitější.

Guido van Rossum tvrdí [1], že jeden programátor se dokáže dobře orientovat přibližně v 20 000 řádcích zdrojového kódu (jeden řádek = jeden příkaz, tím že uvedeme všechny příkazy na jeden řádek si nepomůžeme, právě naopak). Nezáleží na tom v kterém jazyce, prostě 20 000 řádků, Python, Java, C, Asembler to je jedno. Jestiže je Python cca 5 × stručnější než jazyk C, znamená to, že programátor v Pythonu zvládne 5 × větší projekt, protože na co je v Pythonu potřeba 20 000 řádků, na to je v C potřeba 100 000 řádků kódu. Na stránkách o TCL [2] je porovnání časové náročnosti a velikosti kódu implementace některých programů v C a TCL. (TCL je také skriptovací jazyk s vyšším abstraktním vyjadřováním podobně jako Python. Na rozdíl od TCL má Python i vyšší abstraktní datové typy.) Pro Python jsem bohužel podobné porovnání s jazykem C nebo podobným nenašel.

Druhým znakem syntaxe Pythonu je odsazování.

Kdykoli pohlédnete na kód Pythonu, uvidíte, že je hezky odsazený. To proto, že odsazování kódu dle jeho struktury je v Pythonu součástí syntaxe, je povinné. V každém programovacím jazyce je potřeba nějak vyznačovat jeho srukturu, jeho bloky příkazů. Často se k tomu používají složené závorky (C, Java, PHP) nebo klíčová slova (Pascal, VB). Python inteligentně používá odsazování.

Proč inteligentně? Jde o to, že jak závorky tak klíčová slova jsou nepřehledné. Je to fajn pro překladač, ale ne pro člověka. Má-li se člověk ve svém kódu vyznat, musí odsazovat, samotné závorky mu nepomohou. Odsazování kódu patří mezi dobrou praxi u všech jazyků, a odsazují všichni dobří programátoři i naprostá většina těch ostatních. A je tu tedy otázka, proč by měl člověk strukturu programu vyznačovat jedním způsobem pro sebe a druhým pro překladač? Nemůže se snad překladač přizpůsobit lidem? Může, Python je toho důkazem.

Jako bonus k tomu dostáváme předejití všem chybám typu zapomenutá závorka na začátku nebo konci bloku, která dovede programátora, začátečníka především, pěkně potrápit.

Přesto, instinktivně, z toho má řada programátorů obavy, nejsou na to z jiných jazyků zvyklí. Bojí se, že to bude dělat problémy. Patřil jsem mezi ně, ale léta praxe mi ukázala, že to jsou liché obavy. Stačí dodržovat konvenci, že se odsazuje čtyřmi mezerami, ne více, ne méně, ne tabelátory. Není to povinnost, ale je to dobrý zvyk.

Třetím znakem Pythonu je minimalismus.

U Pythonu se tento minimalismus projevuje v co nejmenším počtu podporovaných konstrukcí pro řízení programu. Poskytuje jednu konstrukci pro podmíněné vykonávání vykonávání kódu (if-elif-else), jednu pro opakované vykonávání kódu s konečným počtem cyklů (for-else) a jednu pro opakované vykonávání kódu s podmíněným počtem cyklů (while). To je minimální, ale dostatečná sada konstrukcí pro řízení programu. Snad bychom k tomu mohli přidat i konstrukce pro zachycování výjimek (try-except-finally-else).

Tento minimalismus je v souladu s citátem na začátku kapitoly. Výhodou minimalismu je, že začátečník rychle do programování v Pythonu pronikne. Nemusí se toho tolik učit ani přemítat, kterou z nepřeberného množství konstrukcí vlastně použít. A i výsledný program je pak jednodušší na čtení. Neobjevují se v něm cizokrajné, málo používané a známé konstrukce. I když tohle už není poslední dobou zas až tak moc pravda. Čím víc se Python používá, tím větší jsou na něj kladeny nároky a při jeho vývoji jsou do něj přidávány zajímavé věci. Obvykle se jedná o podporu návrhových vzorů přímo v syntaxi. Python proto má věci jako generátor seznamu, dekorátor a podobně.


Seznam URL na stránce:
[1] http://www.artima.com/intv/speed.html
[2] http://www.tcl.tk/doc/scripting.html