Re: [python] nevznik objektu
Vladimir Macek píše v Út 23. 03. 2010 v 23:51 +0100: On 19.3.2010 00:04, Jirka Vejrazka wrote: Davide, smir se s tim. Vyjimky jsou v Pythonu zavedeny, chapany a podporovany zpusob reagovani na chybove stavy, zejmena na neocekavana data. A i to je zbytecne uzky pohled na to, na co se daji vyjimky pouzivat. Za prve, nekdy vubec nenesou chybovou informaci, ani nejsou spojeny necekanymi daty. Prikladem je built-in http://docs.python.org/library/exceptions.html#exceptions.StopIteration Tedy vyjimka, kterou iterator indikuje, ze je vyprodano. Za druhe, vyjimky jsou normalni objekty, ktere mohou nest libovolna data. Jakoby promenne, ale zpusobi zmenu provadeni programu zcela jinym, ale predem danym a casto uzitecnym smerem (z vnoreni ven). Přesně na to jsem narážel, když jsem říkal, že někdo používá výjimky jako lepší goto (kterým navíc dokážeš vyskočit z funkce). Nejcasteji skutecne nesou podrobnou informaci o chybe vykonavani, ale nikdo nikoho neomezuje v rozsireni tohoto modelu podle aktualnich potreb. Zkus to chvili nechat odlezet, treba se ti to zacne libit :) Za tohle se taky velmi primlouvam. Davide, podle toho, co pisete, jste na zacatku: Syntaxi a knihovnu treba zvladate, ale jeste vas ceka krok prijmouti zpusobu mysleni, ktery zkusenemu pythonistovi pomaha dosahnout vynikajici vykonnosti a elegance kodu. To neni vycitka, naopak, jsem rad, ze se ucite a my ostatni vam radi pomuzeme. Jen to, ze predcasne soudite a snazite se roubovat novy pristup na drive naucene (coz clovek ma clovek tendenci povazovat za to lepsi), to je mirne iritujici. Já to nějak nesoudím, akorát si snažím objasnit některé věci. Imho jsou napřiklad některé z těch syntaktických cukrů špatně - např. odstranění závorek z generátorů (i*i for i in range(4)). Ne, že by se na to nedalo zvyknout, akorát to tady trochu přehnali. Ještě pořád mně vy pythonu přijdou některé věci poměrně nešikovně vyřešené, ale to se časem vsákne. ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] nevznik objektu
On 19.3.2010 00:04, Jirka Vejrazka wrote: Davide, smir se s tim. Vyjimky jsou v Pythonu zavedeny, chapany a podporovany zpusob reagovani na chybove stavy, zejmena na neocekavana data. A i to je zbytecne uzky pohled na to, na co se daji vyjimky pouzivat. Za prve, nekdy vubec nenesou chybovou informaci, ani nejsou spojeny necekanymi daty. Prikladem je built-in http://docs.python.org/library/exceptions.html#exceptions.StopIteration Tedy vyjimka, kterou iterator indikuje, ze je vyprodano. Za druhe, vyjimky jsou normalni objekty, ktere mohou nest libovolna data. Jakoby promenne, ale zpusobi zmenu provadeni programu zcela jinym, ale predem danym a casto uzitecnym smerem (z vnoreni ven). Nejcasteji skutecne nesou podrobnou informaci o chybe vykonavani, ale nikdo nikoho neomezuje v rozsireni tohoto modelu podle aktualnich potreb. Zkus to chvili nechat odlezet, treba se ti to zacne libit :) Za tohle se taky velmi primlouvam. Davide, podle toho, co pisete, jste na zacatku: Syntaxi a knihovnu treba zvladate, ale jeste vas ceka krok prijmouti zpusobu mysleni, ktery zkusenemu pythonistovi pomaha dosahnout vynikajici vykonnosti a elegance kodu. To neni vycitka, naopak, jsem rad, ze se ucite a my ostatni vam radi pomuzeme. Jen to, ze predcasne soudite a snazite se roubovat novy pristup na drive naucene (coz clovek ma clovek tendenci povazovat za to lepsi), to je mirne iritujici. -- \//\/\ : Vladimir Macek : http://macek.sandbox.cz : +420 608 978 164 attachment: macek.vcf___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] nevznik objektu
Skor by som to urobil cez vynimku - konstruktor v pripade zlej IPcky vyvola nejaku vynimku a objekt vytvoris takto: try: ipaddr = IP(192.1023.neco.1) except tvoja_vynimka: print zadavas blby vstup Ak 'ipaddr' potrebujes mat na None aj dalej v kode, tak este do except prihod: ipaddr = None -Pôvodná správa- Od: David Rohleder [mailto:da...@ics.muni.cz] Komu: python@py.cz Predmet: [python] nevznik objektu Ahoj, je možné, aby nevznikl objekt, který zrovna vytvářím? Příklad - mám třídu typu IP adresa, v konstruktoru předávám řetězec IPadresy. Chtěl bych, aby v případě, že IP adresa není validní, objekt vůbec nevznikl. Tj. aby konstruktor vrátil None: ipaddr = IP(192.1023.neco.1) ipaddr None chtěl jsem pak třeba udělat: if not ipaddr: print zadavas blby vstup chtěl jsem to vyřešit asi takto: class IP(object): def __init__(self, IPadresa): . if chyba: return None Jenomže konstruktor vrací vždycky None, tj. touto cestou to nejde. Zatím jediné, co mne napadlo, je vyřešit to pomocí výjimky, tj.např try: ipaddr = IP(192.168.34536.45) except ValueError: ipaddr = None Ale myslím, že kdyby objekt vůbec nevznikl, tak by to bylo lepší. Jde to, nebo to nejde? D. -- David Rohleder da...@ics.muni.cz ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] nevznik objektu
Ahoj Že by konstruktor udělal něco tak, aby žádný objekt nevznikl, nejde (to není bug). Možností je několik: - vyhazovat výjimku (jak již bylo zmíněno) - nevolat konstruktor (tedy nevytvářet objekt), ale volat funkci, která sama vytvoří objekt, nebo vrátí None - podle mě nejlepší řešení - vytvořit objekt, který při porovnání s False vrátí True (lze implementovat přetížením/vytvořením metody __nonzero__) BTW. počítáš i s IPv6, že jo? :) Petr Messner 2010/3/18 David Rohleder da...@ics.muni.cz: Ahoj, je možné, aby nevznikl objekt, který zrovna vytvářím? Příklad - mám třídu typu IP adresa, v konstruktoru předávám řetězec IPadresy. Chtěl bych, aby v případě, že IP adresa není validní, objekt vůbec nevznikl. Tj. aby konstruktor vrátil None: ipaddr = IP(192.1023.neco.1) ipaddr None chtěl jsem pak třeba udělat: if not ipaddr: print zadavas blby vstup chtěl jsem to vyřešit asi takto: class IP(object): def __init__(self, IPadresa): . if chyba: return None Jenomže konstruktor vrací vždycky None, tj. touto cestou to nejde. Zatím jediné, co mne napadlo, je vyřešit to pomocí výjimky, tj.např try: ipaddr = IP(192.168.34536.45) except ValueError: ipaddr = None Ale myslím, že kdyby objekt vůbec nevznikl, tak by to bylo lepší. Jde to, nebo to nejde? D. -- David Rohleder da...@ics.muni.cz ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] nevznik objektu
Ahoj, velmi standardni reseni je vyjimka, typicky ValueError (v tomto pripade). Vracet None v pripade spatnych vstupnich dat neni uplne nejlepsi napad, pokud to ma byt univerzalne pouzitelny kod (pokud jde o tvou vlastni funkci pro interni pouziti, tak si tam samozrejme naprogramuj, co ti zrovna vyhovuje). Jinak na IP adresy existuji velmi dobre napsane moduly, ale to predpokladam vis :) jirka P.S. Ciste technicky vzato, asi by se dalo zajistit aby ten objekt nevzniknul, pomoci metaclass. Ale bez znalosti kontextu se mi to zda zbytecne slozite. ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] nevznik objektu
Petr Messner píše v Čt 18. 03. 2010 v 17:48 +0100: Ahoj Že by konstruktor udělal něco tak, aby žádný objekt nevznikl, nejde (to není bug). Možností je několik: - vyhazovat výjimku (jak již bylo zmíněno) musím přiznat, že řešení pomocí výjimek mně přijde jako s kanonem na vrabce, ikdyž to má svoji logiku. Pokud vnímám výjimku jako nějakou zásadně chybovou situaci, tak to do této věci nesedí, protože s chybným vstupem se má počítat a kód by ho měl ošetřovat. Možná jsem prostě jenom příliš staromódní, začínal jsem programovat v jazycích, kde výjimky nebyly a python je jazyk, kde se výjimky dají používat téměř jako lék na cokoliv. - nevolat konstruktor (tedy nevytvářet objekt), ale volat funkci, která sama vytvoří objekt, nebo vrátí None - podle mě nejlepší řešení To zní zajímavě, ale moc mně to nezapadá do takového toho objektového pohledu na svět. Nutno přiznat, že je to asi celkem jedno, z venku modulu to vypadá stejně jako přímo ten konstruktor objektu. - vytvořit objekt, který při porovnání s False vrátí True (lze implementovat přetížením/vytvořením metody __nonzero__) Tak o __nonzero__ jsem nevěděl. zajímavé. BTW. počítáš i s IPv6, že jo? :) Ne :-) není správně podporován na druhé straně. D. Petr Messner 2010/3/18 David Rohleder da...@ics.muni.cz: Ahoj, je možné, aby nevznikl objekt, který zrovna vytvářím? Příklad - mám třídu typu IP adresa, v konstruktoru předávám řetězec IPadresy. Chtěl bych, aby v případě, že IP adresa není validní, objekt vůbec nevznikl. Tj. aby konstruktor vrátil None: ipaddr = IP(192.1023.neco.1) ipaddr None chtěl jsem pak třeba udělat: if not ipaddr: print zadavas blby vstup chtěl jsem to vyřešit asi takto: class IP(object): def __init__(self, IPadresa): . if chyba: return None Jenomže konstruktor vrací vždycky None, tj. touto cestou to nejde. Zatím jediné, co mne napadlo, je vyřešit to pomocí výjimky, tj.např try: ipaddr = IP(192.168.34536.45) except ValueError: ipaddr = None Ale myslím, že kdyby objekt vůbec nevznikl, tak by to bylo lepší. Jde to, nebo to nejde? D. -- David Rohleder da...@ics.muni.cz ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] nevznik objektu
Jirka Vejrazka píše v Čt 18. 03. 2010 v 18:09 +0100: Ahoj, velmi standardni reseni je vyjimka, typicky ValueError (v tomto pripade). Vracet None v pripade spatnych vstupnich dat neni uplne nejlepsi napad, pokud to ma byt univerzalne pouzitelny kod (pokud jde o tvou vlastni funkci pro interni pouziti, tak si tam samozrejme naprogramuj, co ti zrovna vyhovuje). proč ti přijde vracet None jako špatný nápad? Mně to naopak přijde jako dobrý nápad. můžu psát takové to if objekt: něco Jinak na IP adresy existuji velmi dobre napsane moduly, ale to predpokladam vis :) Narazil jsem jenom na netaddr a ipy, ale netaddr je příliš velký balík na to, co potřebuju a ipy zase nedělá to co chci. Nejsem příznivcem používání příliš velkých knihoven, zvlášť když je dobře neznám. Těch pár funkcí naprogramuju rychleji než bych nastudoval použití tech knihoven. A navíc, beru to trochu jako cestu jak se python trochu naučit, pořád narážím na samé zajímavosti. Třeba mne teď dostal rozdíl mezi for i in f.readline(): a for i in f.readlines(): pořád jsem si říkal, co to dělá za blbosti a pak jsem se musel bít do hlavy, co jsem za pako :-) D. jirka P.S. Ciste technicky vzato, asi by se dalo zajistit aby ten objekt nevzniknul, pomoci metaclass. Ale bez znalosti kontextu se mi to zda zbytecne slozite. ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] nevznik objektu
musím přiznat, že řešení pomocí výjimek mně přijde jako s kanonem na vrabce, ikdyž to má svoji logiku. Pokud vnímám výjimku jako nějakou zásadně chybovou situaci, tak to do této věci nesedí, protože s chybným vstupem se má počítat a kód by ho měl ošetřovat. S tymto absolutne nesuhlasim. Ak hovoris o nejakom peknom osetreni chybneho vstupu (typu vypisanie chybovej spravy), tak toto _absolutne_ nie je ulohou funkcie ci objektu, ale konecnej aplikacie, ktora bude danu funkciu/objekt pouzivat. Osetrenie vstupu je samozrejme nutnost ale nie tymto sposobom - proste staci urobit aby funkcia 'zhucala' a nesnazila sa pokracovat (a pripadne nieco pokazit). Vynimka je na toto priamo stvorena. Možná jsem prostě jenom příliš staromódní, začínal jsem programovat v jazycích, kde výjimky nebyly a python je jazyk, kde se výjimky dají používat téměř jako lék na cokoliv. - nevolat konstruktor (tedy nevytvářet objekt), ale volat funkci, která sama vytvoří objekt, nebo vrátí None - podle mě nejlepší řešení To zní zajímavě, ale moc mně to nezapadá do takového toho objektového pohledu na svět. Nutno přiznat, že je to asi celkem jedno, z venku modulu to vypadá stejně jako přímo ten konstruktor objektu. - vytvořit objekt, který při porovnání s False vrátí True (lze implementovat přetížením/vytvořením metody __nonzero__) Tak o __nonzero__ jsem nevěděl. zajímavé. BTW. počítáš i s IPv6, že jo? :) Ne :-) není správně podporován na druhé straně. D. Petr Messner 2010/3/18 David Rohleder da...@ics.muni.cz: Ahoj, je možné, aby nevznikl objekt, který zrovna vytvářím? Příklad - mám třídu typu IP adresa, v konstruktoru předávám řetězec IPadresy. Chtěl bych, aby v případě, že IP adresa není validní, objekt vůbec nevznikl. Tj. aby konstruktor vrátil None: ipaddr = IP(192.1023.neco.1) ipaddr None chtěl jsem pak třeba udělat: if not ipaddr: print zadavas blby vstup chtěl jsem to vyřešit asi takto: class IP(object): def __init__(self, IPadresa): . if chyba: return None Jenomže konstruktor vrací vždycky None, tj. touto cestou to nejde. Zatím jediné, co mne napadlo, je vyřešit to pomocí výjimky, tj.např try: ipaddr = IP(192.168.34536.45) except ValueError: ipaddr = None Ale myslím, že kdyby objekt vůbec nevznikl, tak by to bylo lepší. Jde to, nebo to nejde? D. -- David Rohleder da...@ics.muni.cz ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] nevznik objektu
To zalezi na pouziti a kontextu, nebudu ti cpat neco co je pro tve pouziti zbytecne. Ale v Pythonu se obvykle povazuje za normalni, ze pokud nejaka funkce dostane chybna vstupni data, tak hodi vyjimku, aby ten kdo ji volal ze udelal neco spatne. Pokud jsou chybna vstupni data ocekavana, tak je to zvlastni pripad. Ale podle toho co popisujes, by se mi tam pocitove rozhodne hodila vyjimka. S tymto taktiez nesuhlasim :) Pri normalnom a korektnom behu aplikacie by vynimky takmer vobec nemali nastavat. Mam skor pocit, ze celu problematiku vynimiek chapes trochu nespravne. Priklad s tym tvojim objektom a kontrolou IP: Ty ako programator by si mal zabezpecit, aby do objektu vosla spravna IP adresa. Objekt bude pouzivat pravdepodobne nejaka aplikacia nad nim, napriklad nejake GUI. Kontrolu vstupnych udajov a chybove spravy pre pouzivatelov by si mal umiestnit prave tam a do objektu zaslat uz korektne data. Vynimky su urcene pre programatorov aby vedeli, kde nastal problem a co treba osetrit/opravit. Nevravim, ze vyvolavanie vynimiek je zle, niekedy je velmi pohodlne a spravne ich pouzit napriklad pri kontrole vstupu - v tvojom pripade nemusis pridavat kontrolu IPcky do GUI (tzn. nemusis kod zdvojovat), staci pridat kontrolu, ktora odchyti vynimku objektu. Vynimky nie su ziadne 'goto', je to skor taka komunikacia medzi roznymi vrstvami kodu. Já mám ovšem z toho používání výjimek někdy pocit, že nahradilo neexistující goto. Prostě chci být najednou někde jinde, tak si vyvolám výjimku a na nějakém správném místě si ji zpracuji. Ale to je věc názoru a čistoty návrhu, kde se to hodí a kde ne. D. -- David Rohleder da...@ics.muni.cz ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] nevznik objektu
azurIt píše v Čt 18. 03. 2010 v 20:35 +0100: musím přiznat, že řešení pomocí výjimek mně přijde jako s kanonem na vrabce, ikdyž to má svoji logiku. Pokud vnímám výjimku jako nějakou zásadně chybovou situaci, tak to do této věci nesedí, protože s chybným vstupem se má počítat a kód by ho měl ošetřovat. S tymto absolutne nesuhlasim. Ak hovoris o nejakom peknom osetreni chybneho vstupu (typu vypisanie chybovej spravy), tak toto _absolutne_ nie je ulohou funkcie ci objektu, ale konecnej aplikacie, ktora bude danu funkciu/objekt pouzivat. Osetrenie vstupu je samozrejme nutnost ale nie tymto sposobom - proste staci urobit aby funkcia 'zhucala' a nesnazila sa pokracovat (a pripadne nieco pokazit). Vynimka je na toto priamo stvorena. Takže ti spadne celá aplikace. OK, s tím se dá počítat, pokud je to jednouživatelská aplikace. Ale co když jde o nějakou třeba webovou službu? Možná jsem prostě jenom příliš staromódní, začínal jsem programovat v jazycích, kde výjimky nebyly a python je jazyk, kde se výjimky dají používat téměř jako lék na cokoliv. - nevolat konstruktor (tedy nevytvářet objekt), ale volat funkci, která sama vytvoří objekt, nebo vrátí None - podle mě nejlepší řešení To zní zajímavě, ale moc mně to nezapadá do takového toho objektového pohledu na svět. Nutno přiznat, že je to asi celkem jedno, z venku modulu to vypadá stejně jako přímo ten konstruktor objektu. - vytvořit objekt, který při porovnání s False vrátí True (lze implementovat přetížením/vytvořením metody __nonzero__) Tak o __nonzero__ jsem nevěděl. zajímavé. BTW. počítáš i s IPv6, že jo? :) Ne :-) není správně podporován na druhé straně. D. Petr Messner 2010/3/18 David Rohleder da...@ics.muni.cz: Ahoj, je možné, aby nevznikl objekt, který zrovna vytvářím? Příklad - mám třídu typu IP adresa, v konstruktoru předávám řetězec IPadresy. Chtěl bych, aby v případě, že IP adresa není validní, objekt vůbec nevznikl. Tj. aby konstruktor vrátil None: ipaddr = IP(192.1023.neco.1) ipaddr None chtěl jsem pak třeba udělat: if not ipaddr: print zadavas blby vstup chtěl jsem to vyřešit asi takto: class IP(object): def __init__(self, IPadresa): . if chyba: return None Jenomže konstruktor vrací vždycky None, tj. touto cestou to nejde. Zatím jediné, co mne napadlo, je vyřešit to pomocí výjimky, tj.např try: ipaddr = IP(192.168.34536.45) except ValueError: ipaddr = None Ale myslím, že kdyby objekt vůbec nevznikl, tak by to bylo lepší. Jde to, nebo to nejde? D. -- David Rohleder da...@ics.muni.cz ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] nevznik objektu
On 18.3.2010, at 23:11, David Rohleder wrote: azurIt píše v Čt 18. 03. 2010 v 20:35 +0100: musím přiznat, že řešení pomocí výjimek mně přijde jako s kanonem na vrabce, ikdyž to má svoji logiku. Pokud vnímám výjimku jako nějakou zásadně chybovou situaci, tak to do této věci nesedí, protože s chybným vstupem se má počítat a kód by ho měl ošetřovat. S tymto absolutne nesuhlasim. Ak hovoris o nejakom peknom osetreni chybneho vstupu (typu vypisanie chybovej spravy), tak toto _absolutne_ nie je ulohou funkcie ci objektu, ale konecnej aplikacie, ktora bude danu funkciu/objekt pouzivat. Osetrenie vstupu je samozrejme nutnost ale nie tymto sposobom - proste staci urobit aby funkcia 'zhucala' a nesnazila sa pokracovat (a pripadne nieco pokazit). Vynimka je na toto priamo stvorena. Takže ti spadne celá aplikace. OK, s tím se dá počítat, pokud je to jednouživatelská aplikace. Ale co když jde o nějakou třeba webovou službu? S výjimkami se musí počítat. U webových aplikací/služeb se typicky odchytávají na úrovni nějakého volání handleru HTTP odpovědi a když je výjimka zachycena, vrátí se HTTP status 500 Server Error, zrollbackují se transakce v databázi atd. a jede se dál. A i kdyby webová aplikace spadla (třeba na SIGSEGV) - v ideálním případě (a většina konfigurací takto funguje) se spustí znovu. Petr Messner ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python