Это общая проблема с вашим пониманием замыканий в python; по умолчанию переменные являются локальными для самой внутренней функции, в которой они назначены. -=
является неявным присваиванием, поэтому to_check
становится локальной переменной для connected
и failed
. Таким образом, to_check
в функции main
никогда не изменяется. В python 3.x, nonlocal to_check
в верхней части connected
и failed
будут делать то, что вы ожидаете. Вот пример того, как сделать то же самое, используя мутацию в 2.x:
import itertools
def main():
ip = "10.1.1."
port = 23
to_check = 10
counter = itertools.count().next
from twisted.internet import reactor
def connected(whathappened):
print >>sys.stdout, "Successfully connected to %s %s" % (whathappened[0],whathappened[1])
return counter()
def failed(reason):
print >>sys.stderr, "Connection to failed : %s" % reason
return counter()
def checked(count):
print >>sys.stdout, "%d connections left to check" % (to_check - count,)
if count == to_check:
reactor.stop()
for i in range(0,total):
d = check_conn(ip + str(i),port)
d.addCallbacks(connected,failed)
d.addBoth(checked)
reactor.run()