variable scope in try ... EXCEPT block.
aleiphoenix at gmail.com
Thu Jul 12 21:42:39 EDT 2018
On Thursday, July 12, 2018 at 5:45:52 PM UTC+8, Ben Bacarisse wrote:
> Yes, it's intentional, but it's not exactly a scope. In
Thank you for the reply. Never thought of this kind of problem in Python3.
On Thursday, July 12, 2018 at 6:02:27 PM UTC+8, Steven D'Aprano wrote:
> You can work around this by explicitly assigning to another local
> except Exception as e:
> err = e # only "e" will be deleted when we exit the block
I ended up with workaround like this.
> This is necessary in Python 3 (but not Python 2) because exception
> objects form a reference cycle with something (the traceback?) which is a
> big, heavyweight object. Allowing random exception objects to stay alive
> for long periods was consuming unacceptable amounts of memory, so it was
> decided to hit this problem with a hammer and fix it in the simplest,
> although least elegant, way: just delete the exception when leaving the
> except block.
> You can see the disassembled byte-code here. Here's the output from
> Python 3.5:
> [assembly code]
And thanks for the kind answer here. Guest I should dig into Python3 deeper.
On Friday, July 13, 2018 at 6:10:57 AM UTC+8, codew... at gmail.com wrote:
> Is there a downside of implementing
> it similarly to this (untested):
> # generate a unique name for __except_N
> except E as __except_N:
> if 'N' in locals() or N in globals():
> __original_N = N
> N = __except_N
> del __except_N
> if '__original_N' in locals():
> N = __original_N
> del __original_N
> del N
I prefer it like this. Thus, like said Python3 have chosen "fix it in the simplest, although least elegant", I guess.
More information about the Python-list