[Python-Dev] Compilation of "except FooExc as var" adds useless store
Serhiy Storchaka
storchaka at gmail.com
Sun Jan 6 10:26:09 EST 2019
06.01.19 13:10, Paul Sokolovsky пише:
> Storing None looks superfluous. For example, DELETE_FAST explicitly
> stores NULL on delete.
> https://github.com/python/cpython/blob/master/Python/ceval.c#L2249
>
> Likewise, for DELETE_NAME/DELETE_GLOBAL, PyObject_DelItem() is
> called which translates to:
>
> m->mp_ass_subscript(o, key, (PyObject*)NULL);
>
> So hopefully any compliant mapping implementation actually clears
> stored value, not leaving it dangling.
>
> The "store None" behavior can be traced down to introduction of the
> "del except target var" behavior back in 2007:
> https://github.com/python/cpython/commit/b940e113bf90ff71b0ef57414ea2beea9d2a4bc0#diff-cb296cc5109f5640ff3f6d7198a6abeeR1999
>
> There's no clear explanation why it's done like that, so probably an
> artifact of the initial implementation. Note that even
> https://github.com/python/cpython/commit/520b7ae27e39d1c77ea74ccd1b184d7cb43f9dcb
> which did quite a bunch of refactoring to "except" implementation, and
> reformatted this code, otherwise left it in place.
Because there is a reason for such code.
See issue1631942 [1] and the thread with the subject "self-contained
exceptions" on the Python-3000 mailing list [2] for the rationale.
In short, the code
try:
1/0
except Exception as e:
del e
should work.
I do not see a problem with storing None before deleting a variable.
This is not a performance critical code, because it is executed only
when an exception was raised and caught.
[1] https://bugs.python.org/issue1631942
[2] https://mail.python.org/pipermail/python-3000/2007-January/005294.html
More information about the Python-Dev
mailing list