Il existe un code comme celui-ci.
def yielder():
#try:
print('yielder setup')
yield 'text'
#finally:
print('yielder teardown')
def yielder_with_finally():
try:
print('yielder setup')
yield 'text'
finally:
print('yielder teardown')
def f(text):
print(text)
Lorsque vous appelez yielder, si vous dites for y dans yielder (): f (y)
, la sortie sera
yielder setup
text
yielder teardown
Cependant, si vous l'utilisez pour que next soit appelé une seule fois (* 3 des 4 méthodes décrites à la fin à l'exclusion de la première),
yielder setup
text
devenir de cette façon. le démontage n'est pas appelé. En ajoutant enfin, le teardown sera appelé.
Cependant, lors de l'appel de cette fonction, avec for y in yielder_with_finally (): f (y)
or y = yielder_with_finally (); f (next (y))
yielder setup
text
yielder teardown
Cependant, si vous appelez t = next (yielder_with_finally ()); f (t)
ou f (next (yielder_with_finally ()))
,
yielder setup
yielder teardown
text
Cela devient un ordre d'exécution inattendu. Il s'est comporté de la même manière dans CPython2 / 3. Cependant, si le démontage est exécuté en appelant next une seule fois, il sera difficile à déboguer (dans IPython, etc.), il se peut donc qu'il ne soit pas possible de l'utiliser de cette manière en premier lieu. ** Ce peut être une bonne idée de ne pas utiliser finalement pour le démontage lors de la cession. ** **
Le dispositif de rendement de pytest est implémenté de manière à pouvoir être tourné deux fois correctement, ce problème ne se produit donc pas. https://docs.pytest.org/en/latest/_modules/_pytest/fixtures.html
Dans PyPy, avec ou sans enfin, le comportement était le même que sans enfin dans CPython.
Je l'ai vérifié avec Ruby, mais le comportement n'a pas changé avec ou sans assurer (similaire à PyPy).
def yielder()
return to_enum(:yielder) if !block_given?
#begin
puts('yielder setup')
yield 'text'
#ensure
puts('yielder teardown')
#end
end
def yielder_with_ensure()
return to_enum(:yielder_with_ensure) if !block_given?
begin
puts('yielder setup')
yield 'text'
ensure
puts('yielder teardown')
end
end
def f(text)
puts(text)
end
Recommended Posts