[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