[python] Zkrácená forma přiřazení selže

Přikryl Petr prikryl na atlas.cz
Úterý Duben 20 15:33:08 CEST 2010


No jo. Je to zjednodušení.

Petr Messner
> Přikryl Petr
>>    def __iter__(self):
>>        '''Vraci iterator -- sam sobe iteratorem.'''
>>        self.idx = 0
>>        return self
>
>prosim takto ne, kdyz udelam
>it = iter(slova)
>it2 = iter(slova)
>tak ty iteratory se navzajem ovlivnuji.

Záleží na tom, k čemu to má sloužit. Dá se to napsat
s odděleným objektem iterátoru:

class Seznam:
    def __init__(self,sez):
        self.data=sez
    def __getitem__(self,idx):
        return idx < len(self.data) and self.data[idx] or None
        
    def __iter__(self):  
        return SeznamIterator(self)

        
class SeznamIterator:
    def __init__(self, obj):
        self.idx = 0
        self.obj = obj

    def next(self):
        '''Standardni podpora iterace.'''
        if self.idx >= len(self.obj.data):
            StopIteration
        hodnota = Seznam.__getitem__(self.obj, self.idx)
        self.idx += 1
        return hodnota           


        
### VSTUP: ###   
slova = Seznam(["ITEM-1","ITEM-2","ITEM-3", 4])

prvni = slova[0]
druhy = slova[1]
treti = slova[2]
ctrty = slova[3]

# Rucne provadena iterace.
it1 = iter(slova)
it2 = iter(slova)

print id(it1)
print id(it2)

print next(it1)
print next(it2)

print next(it1)
print next(it2)

print next(it1)
print next(it2)

print next(it1)
print next(it2)
print '-' * 50

>Problem ale stejne bude v tom, ze kdyz chci
>prvy, druhy, treti, ctrty = slova
>
>tak ten iterator musi vratit presne 4 hodnoty a pak vyvolat
>StopIteration. A jak tomu reknes, ze z toho tahas ty 4 hodnoty? Leda
>tak tim, ze tam fakt budou presne 4. To ale neni chovani, ktere
>ocekava tazatel.

Tady je otázka, jestli je očekávání podporováno realitou.
Nevím, jestli to vůbec nějak jde. Nedivil bych se, kdyby
to nešlo. Takhle se bude chovat i standardní seznam.

Pokud to má podporovat iteraci, pak nemá smysl ani to None v __getitem__()



Další informace o konferenci Python