Skip to content

gh-118921: Add copy() method for FrameLocalsProxy - #118923

Merged
gvanrossum merged 3 commits into
python:mainfrom
gaogaotiantian:framelocalsproxy-copy
May 10, 2024
Merged

gh-118921: Add copy() method for FrameLocalsProxy#118923
gvanrossum merged 3 commits into
python:mainfrom
gaogaotiantian:framelocalsproxy-copy

Conversation

@gaogaotiantian

@gaogaotiantiangaogaotiantian commented May 10, 2024

Copy link
Copy Markdown
Member

@gaogaotiantian

Copy link
Copy Markdown
MemberAuthor

@gvanrossum do we want to support copy.copy(proxy) as well?

@gvanrossumgvanrossum left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LG, one nit. I don't think there's much evidence that people are using copy.copy() for the same purpose, and mappingproxy doesn't support it either.

Comment threadLib/test/test_frame.py Outdated
x = 0
d = sys._getframe().f_locals
d_copy = d.copy()
self.assertIs(type(d_copy), dict)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think assertIsInstance is good enough here.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right, I did not use that method a lot so I didn't think of it.

@gvanrossumgvanrossum added the 3.13 bugs and security fixes label May 10, 2024
@gvanrossum
gvanrossum merged commit 35c4361 into python:mainMay 10, 2024
@gvanrossumgvanrossum added the needs backport to 3.13 bugs and security fixes label May 10, 2024
@miss-islington-app

Copy link
Copy Markdown

Thanks @gaogaotiantian for the PR, and @gvanrossum for merging it 🌮🎉.. I'm working now to backport this PR to: 3.13.
🐍🍒⛏🤖

miss-islington pushed a commit to miss-islington/cpython that referenced this pull request May 10, 2024
…-118923)
(cherry picked from commit 35c4361)
Co-authored-by: Tian Gao <gaogaotiantian@hotmail.com>
@bedevere-app

Copy link
Copy Markdown

GH-118933 is a backport of this pull request to the 3.13 branch.

@bedevere-appbedevere-appBot removed the needs backport to 3.13 bugs and security fixes label May 10, 2024
gvanrossum pushed a commit that referenced this pull request May 10, 2024
…) (#118933)
(cherry picked from commit 35c4361)
Co-authored-by: Tian Gao <gaogaotiantian@hotmail.com>
@gaogaotiantian
gaogaotiantian deleted the framelocalsproxy-copy branch May 12, 2024 20:44
@JelleZijlstraJelleZijlstra mentioned this pull request May 28, 2024
rominf added a commit to rominf/sentry-python that referenced this pull request Jul 10, 2024
Starting from Python 3.13, `frame.f_locals` is not `dict` anymore, but
`FrameLocalsProxy`, that cannot be copied using `copy.copy()`. In Python
3.13 and later, it should be copied using a method `.copy()`. The new way
of copying works the same as the old one for versions of Python prior to
3.13, according to the documentation (both copying methods produce a
shallow copy).
See:
https://peps.python.org/pep-0667/python/cpython#118921python/cpython#118923https://docs.python.org/3.13/whatsnew/3.13.html#porting-to-python-3-13https://docs.python.org/3/library/copy.html
rominf added a commit to rominf/sentry-python that referenced this pull request Jul 10, 2024
Starting from Python 3.13, `frame.f_locals` is not `dict` anymore, but
`FrameLocalsProxy`, that cannot be copied using `copy.copy()`. In Python
3.13 and later, it should be copied using a method `.copy()`. The new way
of copying works the same as the old one for versions of Python prior to
3.13, according to the documentation (both copying methods produce a
shallow copy).
Since Python 3.13, `FrameLocalsProxy` skips items of `locals()` that have
non-`str` keys; this is a CPython implementation detail, so we hence
disable `test_non_string_variables` test on Python 3.13.
See:
https://peps.python.org/pep-0667/python/cpython#118921python/cpython#118923https://docs.python.org/3.13/whatsnew/3.13.html#porting-to-python-3-13https://docs.python.org/3/library/copy.htmlhttps://github.com/python/cpython/blame/7b413952e817ae87bfda2ac85dd84d30a6ce743b/Objects/frameobject.c#L148
sentrivana pushed a commit to getsentry/sentry-python that referenced this pull request Jul 16, 2024
…3271)
Starting from Python 3.13, `frame.f_locals` is not `dict` anymore, but
`FrameLocalsProxy`, that cannot be copied using `copy.copy()`. In Python
3.13 and later, it should be copied using a method `.copy()`. The new way
of copying works the same as the old one for versions of Python prior to
3.13, according to the documentation (both copying methods produce a
shallow copy).
Since Python 3.13, `FrameLocalsProxy` skips items of `locals()` that have
non-`str` keys; this is a CPython implementation detail, so we hence
disable `test_non_string_variables` test on Python 3.13.
See:
https://peps.python.org/pep-0667/python/cpython#118921python/cpython#118923https://docs.python.org/3.13/whatsnew/3.13.html#porting-to-python-3-13https://docs.python.org/3/library/copy.htmlhttps://github.com/python/cpython/blame/7b413952e817ae87bfda2ac85dd84d30a6ce743b/Objects/frameobject.c#L148
sentrivana added a commit to getsentry/sentry-python that referenced this pull request Jul 16, 2024
Adding preliminary support for Python 3.13.
The `_partialmethod` attribute of methods wrapped with `partialmethod()`
was renamed to `__partialmethod__` in CPython 3.13:
python/cpython#16600
Starting from Python 3.13, `frame.f_locals` is not `dict` anymore, but
`FrameLocalsProxy`, that cannot be copied using `copy.copy()`. In Python
3.13 and later, it should be copied using a method `.copy()`. The new way
of copying works the same as the old one for versions of Python prior to
3.13, according to the documentation (both copying methods produce a
shallow copy).
Since Python 3.13, `FrameLocalsProxy` skips items of `locals()` that have
non-`str` keys; this is a CPython implementation detail, so we hence
disable `test_non_string_variables` test on Python 3.13.
See:
https://peps.python.org/pep-0667/python/cpython#118921python/cpython#118923https://docs.python.org/3.13/whatsnew/3.13.html#porting-to-python-3-13https://docs.python.org/3/library/copy.htmlhttps://github.com/python/cpython/blame/7b413952e817ae87bfda2ac85dd84d30a6ce743b/Objects/frameobject.c#L148
---------
Co-authored-by: Roman Inflianskas <rominf@pm.me>
estyxx pushed a commit to estyxx/cpython that referenced this pull request Jul 17, 2024
arjennienhuis pushed a commit to arjennienhuis/sentry-python that referenced this pull request Sep 30, 2024
Adding preliminary support for Python 3.13.
The `_partialmethod` attribute of methods wrapped with `partialmethod()`
was renamed to `__partialmethod__` in CPython 3.13:
python/cpython#16600
Starting from Python 3.13, `frame.f_locals` is not `dict` anymore, but
`FrameLocalsProxy`, that cannot be copied using `copy.copy()`. In Python
3.13 and later, it should be copied using a method `.copy()`. The new way
of copying works the same as the old one for versions of Python prior to
3.13, according to the documentation (both copying methods produce a
shallow copy).
Since Python 3.13, `FrameLocalsProxy` skips items of `locals()` that have
non-`str` keys; this is a CPython implementation detail, so we hence
disable `test_non_string_variables` test on Python 3.13.
See:
https://peps.python.org/pep-0667/python/cpython#118921python/cpython#118923https://docs.python.org/3.13/whatsnew/3.13.html#porting-to-python-3-13https://docs.python.org/3/library/copy.htmlhttps://github.com/python/cpython/blame/7b413952e817ae87bfda2ac85dd84d30a6ce743b/Objects/frameobject.c#L148
---------
Co-authored-by: Roman Inflianskas <rominf@pm.me>
turicas added a commit to turicas/sentry-python that referenced this pull request Jun 6, 2025
Partial cherry-pick of: a98f660
Adding preliminary support for Python 3.13.
The `_partialmethod` attribute of methods wrapped with `partialmethod()`
was renamed to `__partialmethod__` in CPython 3.13:
python/cpython#16600
Starting from Python 3.13, `frame.f_locals` is not `dict` anymore, but
`FrameLocalsProxy`, that cannot be copied using `copy.copy()`. In Python
3.13 and later, it should be copied using a method `.copy()`. The new way
of copying works the same as the old one for versions of Python prior to
3.13, according to the documentation (both copying methods produce a
shallow copy).
Since Python 3.13, `FrameLocalsProxy` skips items of `locals()` that have
non-`str` keys; this is a CPython implementation detail, so we hence
disable `test_non_string_variables` test on Python 3.13.
See:
https://peps.python.org/pep-0667/python/cpython#118921python/cpython#118923https://docs.python.org/3.13/whatsnew/3.13.html#porting-to-python-3-13https://docs.python.org/3/library/copy.htmlhttps://github.com/python/cpython/blame/7b413952e817ae87bfda2ac85dd84d30a6ce743b/Objects/frameobject.c#L148
turicas added a commit to turicas/sentry-python that referenced this pull request Jun 6, 2025
Partial cherry-pick of: a98f660
Adding preliminary support for Python 3.13.
The `_partialmethod` attribute of methods wrapped with `partialmethod()`
was renamed to `__partialmethod__` in CPython 3.13:
python/cpython#16600
Starting from Python 3.13, `frame.f_locals` is not `dict` anymore, but
`FrameLocalsProxy`, that cannot be copied using `copy.copy()`. In Python
3.13 and later, it should be copied using a method `.copy()`. The new way
of copying works the same as the old one for versions of Python prior to
3.13, according to the documentation (both copying methods produce a
shallow copy).
Since Python 3.13, `FrameLocalsProxy` skips items of `locals()` that have
non-`str` keys; this is a CPython implementation detail, so we hence
disable `test_non_string_variables` test on Python 3.13.
See:
https://peps.python.org/pep-0667/python/cpython#118921python/cpython#118923https://docs.python.org/3.13/whatsnew/3.13.html#porting-to-python-3-13https://docs.python.org/3/library/copy.htmlhttps://github.com/python/cpython/blame/7b413952e817ae87bfda2ac85dd84d30a6ce743b/Objects/frameobject.c#L148
turicas added a commit to turicas/sentry-python that referenced this pull request Jun 6, 2025
Partial cherry-pick of: a98f660
Adding preliminary support for Python 3.13.
The `_partialmethod` attribute of methods wrapped with `partialmethod()`
was renamed to `__partialmethod__` in CPython 3.13:
python/cpython#16600
Starting from Python 3.13, `frame.f_locals` is not `dict` anymore, but
`FrameLocalsProxy`, that cannot be copied using `copy.copy()`. In Python
3.13 and later, it should be copied using a method `.copy()`. The new way
of copying works the same as the old one for versions of Python prior to
3.13, according to the documentation (both copying methods produce a
shallow copy).
Since Python 3.13, `FrameLocalsProxy` skips items of `locals()` that have
non-`str` keys; this is a CPython implementation detail, so we hence
disable `test_non_string_variables` test on Python 3.13.
See:
https://peps.python.org/pep-0667/python/cpython#118921python/cpython#118923https://docs.python.org/3.13/whatsnew/3.13.html#porting-to-python-3-13https://docs.python.org/3/library/copy.htmlhttps://github.com/python/cpython/blame/7b413952e817ae87bfda2ac85dd84d30a6ce743b/Objects/frameobject.c#L148
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

3.13bugs and security fixes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@gaogaotiantian@gvanrossum@szef1233