We wpisie "reactor i
deferred" przedstawiłem
koncepcje programowania asynchronicznego z wykorzystaniem obiektu Deferred w
którym kolejkowane były zadania. Taki sposób pisania może być jednak bardzo
niewygodny, jeśli okaże się, że w swoim kodzie mamy wiele miejsc
oczekujących na dane. Każdorazowe pojawienie się nowych informacji wymaga
napisania nowej funkcji która je obsłuży. Drugie
tyle, jeśli chcemy oprogramować możliwe wystąpienia błędów.
Generatory
Jaki jest generator, każdy widzi. Najprostszym przykładem może być generowanie kolejnych liczb:
>>> def gen_number(start): ... while True: ... start += 1 ... yield start ... >>> g = gen_number(2) >>> g.next() 3 >>> g.next() 4 >>> g.next() 5
Jeśli chcesz dowiedzieć się o nich więcej, polecam prezentację "Generator Tricks for Systems Programmers".
Generatory, aż do Pythona 2.5 miały bardzo poważną wadę - były hermetyczne. Utworzony ...