[python] nevznik objektu

Michal Vyskocil michal.vyskocil na gmail.com
Čtvrtek Březen 25 08:58:30 CET 2010


18.3.10, David Rohleder <davro na ics.muni.cz>:
> 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.

No tak to nemusí být funkce, ale metoda třídy

class IP(object):
    ...
    @classmethod
    def parse(cls, ip):
        ...
        if chyba: return None

objekt = IP.parse("123.456.789.0")

Je to sice trošku Javovský přístup, ale aspoň to nezačíná na class IPFactory :-)

>
>
>  >  - 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 <davro na 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 <davro na ics.muni.cz>
>  > >
>  > > _______________________________________________
>  > > Python mailing list
>  > > Python na py.cz
>  > > http://www.py.cz/mailman/listinfo/python
>  > >
>  > _______________________________________________
>  > Python mailing list
>  > Python na py.cz
>  > http://www.py.cz/mailman/listinfo/python
>
>  _______________________________________________
>  Python mailing list
>  Python na py.cz
>  http://www.py.cz/mailman/listinfo/python
>


-- 
best regards
     Michal Vyskocil


Další informace o konferenci Python