[python] Statické metody v Pythonu

Petr Prikryl PrikrylP na skil.cz
Čtvrtek Listopad 9 12:05:51 CET 2006


> > Ano. Ale toto je otázka návrhu. Typicky se definuje operátor
> > pro sčítání (operator+() nebo __add__()), který pracuje s
> > argumentem stejné třídy, jako je sám objekt. V budoucnu si můžu
> > vymyslet další konverze, ze kterých vypadne úhel. Z hlediska
> > údržby je lepší, když se speciality dělají zvenku. Je tedy
> > lepší venku převést string zeměpisné šířky na úhel a
> > dosadit.
> 
> A proč tedy můžu v Pytonu psát:
>      unicode_string + ansi_8_bit_string
> Proč v rámci tohoto pravdidla Python striktně netrvá na:
>      unicode_string + uniocde(ansi_8_bit_string)
> 
> Ono toto pravidlo, kdyby se mělo striktně dodržovat, 
> pak bude každý programovací jazyk včetně Pythonu ukecaný
> jako COBOL, nebo Ada.

Je to věc návrhu. Z logického hlediska unicode_string je
řetězec a ansi_8bit_string je taky řetězec. Bylo to jasné
už v okamžiku, kdy se ten operátor zaváděl. Taky bylo jasné,
že řetězce se budou používat intenzivně. Ale taky platí,
že žádný další typ se takto k řetězci přidat nedá! Nemůžu
tedy udělat
             unicode_string + 123

I když nadefinovat příslušný operátor by bylo možné 
a relativně snadné. Jenže za chvíli bych si mohl vymyslet,
že chci k řetězci přidávat kde co. Pro objekty to jde
vlastně podobně, jako kdyby se v C++ implicitně použil
dříve zmíněný konstruktor (tentokrát řetězce), který by
definoval konstruktor pro daný argument. Ale jde to jen
pro objekty třídy, které definují metodu __str__(). 
To je ale přístup z druhé strany. Jde to vlastně tehdy,
když objekt EXPLICITNĚ definuje konverzi na řetězec. 
Metoda __str__ je svým způsobem výjimečná -- cokoliv
často potřebujeme převádět na řetězec.

A to je podle mého názoru i odpověď na to, proč by se 
němělo dělat něco jako 

     uhel + "30N54"

Řetězce mají přece jen výsadní postavení. Při jejich 
vytváření se dokonce používá speciální syntaktická 
konstrukce. Ale stejně mohou nastávat problémy, protože
k ne-unicode řetězci musí někde existovat dodatečná 
informace, jaké kódování je použito.

>  > Readability counts.
>  > Special cases aren't special enough to break the rules.
>  > In the face of ambiguity, refuse the temptation to guess.
>  > If the implementation is hard to explain, it's a bad idea.
>  > If the implementation is easy to explain, it may be a good idea.
> 
> Pod to se podepisuji.

To nemůžeš. Pod tím už je podepsaný Tim Peters ;)
 
> [...] Já jsem taky původně váhal, jestli namísto 
> třídy Angle neudělat prostě pár normálních funkcí 
> a třídou se vůbec nezatěžovat. Na jednodušší věci 
> by to možná bylo lepší, prostě by zbytečně nevznikaly 
> instance, všechno by byl float. Ale nakonec jsem 
> se rozhodl pro komplexní řešení včetně operátorů, 
> property a dalších.

Je v tom skrytý určitý odpor k OOP (přílišný
konzervatismus -- neber to jako výtku). Pokud 
vyjádření "zbytečný vznik instance" nahradím
vyjádřením "zbytečný vznik proměnné", pak to vypadá
divně. Přitom vznik instance třídy nemusí být
v daném jazyce o moc náročnější, než vznik 
proměnné (ve smyslu jak to chápou kompilované
jazyky). Když použiji float, v Pythonu taky 
vzniká instance nějakého objektu.

pepr


Další informace o konferenci Python