RE: [python] některé Pythonovské konstrukce

Petr Prikryl Prikryl na skil.cz
Pátek Květen 6 09:29:32 CEST 2005


Jindra Sarson napsal...
> 
> předem musím říct, že jsem si Python velmi oblíbil
> a přijde mi jako super jazyk. Zajímalo by mě ale,
> proč se tento jazyk, který je ve spoustě oblastí
> konzistentní a přímočarý uchyluje k dost
> komplikovaným konstrukcím, které by šly vyřešit
> určitě lépe.

V podobných případech to bývá věc názoru, vkusu,
osobních zkušeností... Pokud byste ten jazyk
implementoval od stejných historických počátků,
jak to dělal GvR, možná byste se na to díval
jinak. Samotný postup implementace a vnitřní,
uživateli neviditelné věci mohou ovlivňovat
syntaxi. Ačkoliv nové verze Pythonu občas syntaxi
mělily (dynamičtěji, než jiné známé jazyky), přece
jen je vhodné dodržovat určitou zpětnou
kompatibilitu se staršími verzemi. Když se to vše
prolne a zapadne do sebe, dopadne to tak, jak to
dopadlo. 

> Mám na mysli např:
> - definice statické metody přes funkci - tj.
>   kromě definice fce musím ještě volat funkci
>   classmethod. Proč se to neřeší např. přes nějaké
>   klíčové slovo?

Kompilované jazyky vyžadují přísnější strukturu
zápisu programu, protože se více věcí musí vyřešit
v době kompilace. Řešení speciálnějších věcí
vyžaduje zavedení pevnějších, speciálnějších
konstrukcí. Znamená to často zavedení dalších
klíčových slov nebo složitější rozpoznávání
konstrukcí ve zdrojovém textu. 

Čím speciálnější účel klíčové slovo vyjadřuje, tím
méně se používá a tím má menší oprávněnost pro
svou existenci (pokud to jde bez něj). 

Vždy se zvažují kompromisy: něco musí patřit do
jádra jazyka, něco ne (viz C/C++). Čím méně se
toho nacpe do jádra jazyka, tím pružnější jazyk
bude při dalším vývoji. Pokud stačí dodat místo
klíčového slova zabudovanou funkci, pak je vhodné
dodat spíše zabudovanou funkci. V počátcích se s
ní lépe experimentuje. Pokud je její použití
řídké, nebývá stručnější zápis (například pomocí
klíčového slova nebo speciální syntaktické
konstrukce) vnímán jako potřebný, nezbytně nutný.
Jakmile se ukáže obecná životaschopnost a vysoká
užitečnost nějakého rysu, pak stojí za úvahu
zavedení speciální syntaxe, která jasný princip
vyjádří stručněji a přehledněji.

Konkrétně classmethod() a staticmethod() mohou být
v určitých případech užitečné, ale asi se
nepoužívají každý den. Samotná konstrukce, kdy se
voláním podobných funkcí doplňují informace k běžné
metodě třídy, kdy dochází k nějaké vnitřní změně,
se ale ukázala jako prakticky požadovaná. Proto se
autoři Pythonu rozhodli zavést dekorátory
začínající zavináčem:

  @classmethod
  def m(cls, a):
      ...

V podstatě je lze v těchto situacích chápat jako
klíčová slova, která si ovšem může doplnit sám
uživatel. Je to něco obecného a nového, co v
kompilovaných jazycích nenacházíme.
      
> - podobně s property

Property jako takové jsou, jak se s oblibou říká,
"syntaktickým cukrem" a skalní programátoři nad
takovými věcmi často krčí nos. Skutečností je, že
při vhodném použití mohou velmi zvýšit čitelnost a
tím i udržovatelnost programu. Na druhou stranu
jsou property přece jen věcí v jazycích poměrně
novou a není tak docela jasné, jak by měl vypadat
ten "nejsprávnější" zápis za použití těch
"nejsprávnějších" klíčových slov.

Otázku "Proč neexistuje lepší způsob zápisu?"
můžeme nahradit otázkou "Jak by měl takový zápis
konkrétně vypadat?".

> - podtržítkové zběsilosti - např. při definici
>   privátní metody - nebylo by opět lepší klíčové
>   slovo?

Pythonovský přístup v podstatě spočívá v zavedení
pomůcky, která lépe vynucuje konvenci. Programátor
nemůže omylem přistupovat k pvkům, které si
označil jako privátní. Důsledné zavedení
privátnosti (a dalších úrovní privátnosti) vede ke
komplikacím v jazyce. Ty mohou mít své výhody u
kompilovaného jazyka, kde musí být vše řešeno v
době kompilace. U interpretovaného jazyka, kde lze
pracovat dynamičtěji, nelze tak dobře zkontrolovat
záměry programátora. Proto se na něj přenáší více
zodpovědnosti za zneužití některých možností.

Python je "jiný" než například C++. Vede také k
jinému stylu práce. Dokud tento styl vyhovuje a
osvědčuje se, dotud bude vyhovovat i Python. Pokud
je lepší použít pro určitou věc jiný jazyk, nechť
je použit jiný jazyk.

> ... našly by se i další věci. Zajímalo by mě, jaký
> byl důvod k zavedení těchto konstrukcí. Podle mě
> dost znepřehledňují kód. Je důvodem co nejmenší
> počet klíčových slov, nebo něco jiného?

Bylo by dobré uvést konkrétní příklad a diskutovat
nad jeho řešením. Jiné debaty jsou podobně
akademické, jako "kolik andělů se vleze na špičku
jehly".

Petr



Další informace o konferenci Python