Jak mogę zatrzymać Pythona przed usunięciem powiązania nazwy, gdy ta nazwa jest używana do wiązania wyjątku, który został przechwycony? Kiedy ta zmiana w zachowaniu pojawiła się w Pythonie?Powiązanie nazwy w klauzuli "except" usunięto po klauzuli
piszę kod do uruchomienia zarówno Python 2 i Python 3:
exc = None
try:
1/0
text_template = "All fine!"
except ZeroDivisionError as exc:
text_template = "Got exception: {exc.__class__.__name__}"
print(text_template.format(exc=exc))
Uwaga, exc
jest wyraźnie związany przed obsługę wyjątków, więc Python wie, że jest to nazwa w zakresie zewnętrznej.
W Pythonie 2.7, to działa dobrze, a nazwa exc
przetrwa do stosowania w format
wezwanie ::
Got exception: ZeroDivisionError
Wielki, to jest dokładnie to, co chcę: Klauzula except
wiąże nazwę i Mogę użyć tej nazwy w dalszej części funkcji, aby odnieść się do obiektu wyjątku .
W Pythonie 3.5, wywołanie format
powiodło się, ponieważ najwyraźniej exc
wiązanie usunięte ::
Traceback (most recent call last):
File "<stdin>", line 8, in <module>
NameError: name 'exc' is not defined
Dlaczego exc
wiązaniami usunięty z zakresu zewnętrznej? W jaki sposób mamy oznaczać , aby niezawodnie zachować nazwę powiązania, aby móc z niego korzystać po z klauzulą except
?
Kiedy ta zmiana pojawiła się w Pythonie, gdzie jest udokumentowana?
Czy mam rację zgłaszając to jako błąd w Pythonie 3?
wygląda to zamierzone. Jeśli przypiszesz 'exc' do innej zmiennej w klauzuli' except', możesz ją tam pobrać. Możliwy duplikat https://stackoverflow.com/questions/29268892/python-3-exception-deletes-variable-in-enclosing-scope-for-unknown-reason Wiedziałem, że powinienem był odpowiedzieć na to pytanie ... lol –