[python] jak pretizit oper8tory and, or, not

Radek Kanovsky rk na dat.cz
Čtvrtek Duben 15 22:22:45 CEST 2004


On Sun, Apr 11, 2004 at 08:50:09PM +0200, Petr Kolesa wrote:

> Ahoj,
> 
> potreboval bych pretizit logicke operatory (and, or, xor, not). Presneji 
> potrebuju tridu, ktera muze byt uvedena v logicem vyrazu:
> 
> (True and moje_instance) xor False
> 
> 
> Prostrednictvim metod __and__ & spol zatim umim
> 
> (True & moje_instance) ^ False
> 
> (bitove operatory) ale to neni ono protoze napr. ~False  != True.
> Je nejaky zpusob, jak pretizit operatory or, and, etc?

Obavam se, ze pretizit klicova slova and, or a not nelze. Tyto operace
jsou kompilovany na podminene jumpy v bajtkodu. Vyraz ``expr1 and expr2''
nevyvola zadnou specialni metodu ani na jednom z objektu expr1/expr2.

Pokud maji ovsem instance nejake tridy poskytovat urcite pravdivostni
hodnoty, staci definovat ve tride metodu `__nonzero__'.  Napr.:

    class MojeLogika :
        def __init__ (self, i) :
            self.i = int(i)
        def __nonzero__ (self) :
            if self.i > 10 : return True
            return False


    >>> bool(MojeLogika(-10))
    False
    >>> bool(MojeLogika(0))
    False
    >>> bool(MojeLogika(10))
    False
    >>> bool(MojeLogika(100))
    True
    >>> bool(MojeLogika(1) and MojeLogika(1))
    False
    >>> bool(MojeLogika(1) or MojeLogika(1))
    False
    >>> bool(not MojeLogika(0))
    True
    >>> bool(not MojeLogika(1))
    True

Radek Kaňovský



Další informace o konferenci Python