Je pense que ma question est liée à cela, mais pas exactement similaires. Considérer ce code:
def countdown(n):
try:
while n > 0:
yield n
n -= 1
finally:
print('In the finally block')
def main():
for n in countdown(10):
if n == 5:
break
print('Counting... ', n)
print('Finished counting')
main()
La sortie de ce code est:
Counting... 10
Counting... 9
Counting... 8
Counting... 7
Counting... 6
In the finally block
Finished counting
Est-il garanti que la ligne "Dans le bloc finally" va être imprimé avant "Fini le comptage"? Ou est-ce à cause de disponible détail de l'implémentation qu'un objet sera d'ordures collectées lorsque la référence du compte à rebours atteint 0.
Aussi, je suis curieux sur la façon dont finally
bloc de l' countdown
générateur est exécuté? par exemple, si je change le code de l' main
de
def main():
c = countdown(10)
for n in c:
if n == 5:
break
print('Counting... ', n)
print('Finished counting')
ensuite, je ne vois Finished counting
imprimé avant d' In the finally block
. Comment le garbage collector aller directement à l' finally
bloc? Je pense que j'ai toujours pris try/except/finally
de sa valeur nominale, mais la pensée dans le contexte de générateurs est de me faire réfléchir à deux fois à ce sujet.