You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
it's no longer possible to delete items from f_locals (FrameLocalsProxy) in 3.13+ #125590
In the example script above, if the code falls into the except: pass block due to an alert not being displayed, the script will ultimately fail (even if no coding errors are encountered) with FAILED (errors=1) .
Also, the following messages will be displayed in the output:
This code works fine in Python 3.12. The script succeeds with message OK and none of the above error messages. We can't move to 3.13 version until this is fixed.
The reason why FrameLocalsProxy did not support pop and del in the first place, is because it does not make sense to "remove" a local variable from the frame. However, in this specific case, the debugger is trying to remove an extra variable, which is artificially added. I think it might be fine to check if it's an actual local variable and only report error when it is.
I'm not particularly familiar with how PEP 667 was implemented. From my understanding, deleting from f_locals was previously possible--is it that it can't be implemented right now, or is it that it's dangerous to expose to users?
The semantics of f_locals has changed. f_locals used to be a pure dict which was written back to the real locals on certain occasions (the most common one is returning from trace functions). The old behavior, when you remove a key from f_locals, if it was written back, was to set the local variable to None and generate a warning - a very inconsistent and confusing behavior.
Popping and deleting keys in the "extras" dict should be fine. It gets complicated when the key is a "fast" local.
Let's allow popping and deleting keys in extras, and generate an exception (we are generating one now on del) if the user tries to remove a real local variable. Do we consider this a bug so we need to backport it to 3.13?
changed the title [-]try except pass results in a script failure and system errors when code falls into pass logic - new bug in Python 3.13[/-][+]it's no longer possible to delete items from f_locals (FrameLocalProxy) in 3.13+[/+]on Oct 16, 2024
changed the title [-]it's no longer possible to delete items from f_locals (FrameLocalProxy) in 3.13+[/-][+]it's no longer possible to delete items from f_locals (FrameLocalsProxy) in 3.13+[/+]on Oct 16, 2024
The semantics of f_locals has changed. f_locals used to be a pure dict which was written back to the real locals on certain occasions (the most common one is returning from trace functions). The old behavior, when you remove a key from f_locals, if it was written back, was to set the local variable to None and generate a warning - a very inconsistent and confusing behavior.
how do you generate the warning?
I tried this on 3.12 and didn't see a warning, and the local didn't get set to None:
I tried this on 3.12 and didn't see a warning, and the local didn't get set to None:
This is the case where the f_locals is not written back. Like I said, it was only written back on certain occasions, for example, when it returns from a trace function. And that's why we need to change it.
Hello. Just checking back on this bug. Is there a plan to fix it and update the current Python 3.13 version with the fix? If so, when is that expected so I can reinstall Python 3.13? Thanks.
The fix is in #125590 and it should be merged soon. We don't update the current version of 3.13, so 3.13.0 will be always like this without the fix. However, 3.13.1 should come up with the fix. It's estimated to be released two months after 3.13.0 so probably December.
The fix is in #125590 and it should be merged soon. We don't update the current version of 3.13, so 3.13.0 will be always like this without the fix. However, 3.13.1 should come up with the fix. It's estimated to be released two months after 3.13.0 so probably December.
Activity
JelleZijlstra commentedon Oct 16, 2024
This sounds like an issue in the version of
pydevdbundled by the Microsoft Python extension.I assume it's related to the FrameLocalsProxy changes from PEP-667; cc @gaogaotiantian.
ZeroIntensity commentedon Oct 16, 2024
Maybe
FrameLocalsProxyshould just implement pop? (Or better yet, the rest of thedictinterface.)graingert commentedon Oct 16, 2024
problem is you cannot remove items from FrameLocalsProxy:
cpython/Objects/frameobject.c
Line 162 in d83fcf8
I think pydevd has to do
gaogaotiantian commentedon Oct 16, 2024
The reason why
FrameLocalsProxydid not supportpopanddelin the first place, is because it does not make sense to "remove" a local variable from the frame. However, in this specific case, the debugger is trying to remove an extra variable, which is artificially added. I think it might be fine to check if it's an actual local variable and only report error when it is.@markshannon and @gvanrossum as this was the discussion result from PEP 667 implementation.
ZeroIntensity commentedon Oct 16, 2024
I'm not particularly familiar with how PEP 667 was implemented. From my understanding, deleting from
f_localswas previously possible--is it that it can't be implemented right now, or is it that it's dangerous to expose to users?markshannon commentedon Oct 16, 2024
Popping and deleting keys in the "extras" dict should be fine.
It gets complicated when the key is a "fast" local.
In the style of the PEP, this would give us:
gaogaotiantian commentedon Oct 16, 2024
The semantics of
f_localshas changed.f_localsused to be a pure dict which was written back to the real locals on certain occasions (the most common one is returning from trace functions). The old behavior, when you remove a key fromf_locals, if it was written back, was to set the local variable toNoneand generate a warning - a very inconsistent and confusing behavior.gaogaotiantian commentedon Oct 16, 2024
Let's allow popping and deleting keys in extras, and generate an exception (we are generating one now on
del) if the user tries to remove a real local variable. Do we consider this a bug so we need to backport it to 3.13?[-]try except pass results in a script failure and system errors when code falls into pass logic - new bug in Python 3.13[/-][+]it's no longer possible to delete items from f_locals (FrameLocalProxy) in 3.13+[/+][-]it's no longer possible to delete items from f_locals (FrameLocalProxy) in 3.13+[/-][+]it's no longer possible to delete items from f_locals (FrameLocalsProxy) in 3.13+[/+]graingert commentedon Oct 16, 2024
how do you generate the warning?
I tried this on 3.12 and didn't see a warning, and the local didn't get set to None:
gaogaotiantian commentedon Oct 16, 2024
This is the case where the
f_localsis not written back. Like I said, it was only written back on certain occasions, for example, when it returns from a trace function. And that's why we need to change it.113908 commentedon Oct 18, 2024
Hello. Just checking back on this bug. Is there a plan to fix it and update the current Python 3.13 version with the fix? If so, when is that expected so I can reinstall Python 3.13? Thanks.
gaogaotiantian commentedon Oct 18, 2024
The fix is in #125590 and it should be merged soon. We don't update the current version of 3.13, so 3.13.0 will be always like this without the fix. However, 3.13.1 should come up with the fix. It's estimated to be released two months after 3.13.0 so probably December.
gh-125590: Allow FrameLocalsProxy to delete and pop keys from extra l…
pythongh-125590: Allow FrameLocalsProxy to delete and pop keys from e…
[3.13] gh-125590: Allow FrameLocalsProxy to delete and pop keys from …
113908 commentedon Dec 3, 2024
Has version 3.13.1 been released yet?
graingert commentedon Dec 3, 2024
Expected on the 12th https://peps.python.org/pep-0719/#bugfix-releases
JelleZijlstra commentedon Dec 3, 2024
I believe the release is currently in progress, actually. The announcements should come shortly.
graingert commentedon Dec 4, 2024
https://discuss.python.org/t/python-3-13-1-3-12-8-3-11-11-3-10-16-and-3-9-21-are-now-available/73214
It's out
pythongh-125590: Allow FrameLocalsProxy to delete and pop keys from e…
Build with python 3.13 in parallel (#18611)