Python 3 removes name binding from outer scope

Steve D'Aprano steve+python at pearwood.info
Mon Jul 24 22:52:17 EDT 2017


On 2017年7月25日 11:41 am, Ben Finney wrote:
> Howdy all,
>> How can I stop Python from deleting a name binding, when that name is
> used for binding the exception that is caught? When did this change in
> behaviour come into Python?
>>> I am writing code to run on both Python 2 and 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))
>> Notice that `exc` is explicitly bound before the exception handling, so
> Python knows it is a name in the outer scope.

Ethan has already answered your direct question, but I'd like to make an
observation: there's no "outer scope" here, as the try...except statement
doesn't introduce a new scope. All your code above runs in a single scope with
a single namespace. It isn't that the except block is in a different scope, but
that the except statement now explicitly calls "del" on the exception name when
the block ends.
-- 
Steve
“Cheer up,” they said, “things could be worse.” So I cheered up, and sure
enough, things got worse.


More information about the Python-list mailing list

AltStyle によって変換されたページ (->オリジナル) /