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
Yes, those should both be is checks -- enum members are singletons, so a copy of any kind should return the exact same object.
[copy module questions]
An enum class, such as Color, is processed by that branch; a member, such as Color.RED, falls through to the else branch where a __deepcopy__ is looked for.
Enum.__copy__ and Enum.__deepcopy__ just need to return self.
Ohh, I thought, this one also got reported on StackOverflow just like a calendar module feature I once picked.
I have added a PR
Btw, I learned a lot about Enum's internal design because of the wrong assumption that deep-copy(Enum or its member) will return a new Enum
Activity
Agent-Hellboy commentedon Jul 11, 2023
Hi @ethanfurman, I thought of implementing this.
did you mean we should be able to make a deep copy of the whole enum like adding
ischeck in herehttps://github.com/python/cpython/blob/1f2921b72c369b19c2e32aaedb9f8c63e0cb8b48/Lib/test/test_enum.py#L803C1-L808C35
if yes, then we need to make changes in copy module because Enums are getting created using a custom metaclass
and deep copy returns the object as it is if the class is a subclass of a type
https://github.com/python/cpython/blob/1f2921b72c369b19c2e32aaedb9f8c63e0cb8b48/Lib/copy.py#L137C1-L139C42
Where did the bug get reported? Do you know if I can see the StackOverflow link?
if it's about copying a member (adding deepcopy in Enum) then I will explore more
currently, it is taking the same object for new_enum as well as self
ethanfurman commentedon Jul 11, 2023
Yes, those should both be
ischecks -- enum members are singletons, so a copy of any kind should return the exact same object.An enum class, such as
Color, is processed by that branch; a member, such asColor.RED, falls through to theelsebranch where a__deepcopy__is looked for.Enum.__copy__andEnum.__deepcopy__just need to returnself.This issue is where the bug was reported.
ethanfurman commentedon Jul 11, 2023
The current
test_copyis testing an enum class -- we need to add a test for enum members. All those copy tests should be usingis.pythongh-106602: Add __copy__ and __deepcopy__ in Enum
pythongh-106602: Add __copy__ and __deepcopy__ in Enum
Agent-Hellboy commentedon Jul 12, 2023
Ohh, I thought, this one also got reported on StackOverflow just like a calendar module feature I once picked.
I have added a PR
Btw, I learned a lot about Enum's internal design because of the wrong assumption that deep-copy(Enum or its member) will return a new Enum
gh-106602: [Enum] Add __copy__ and __deepcopy__ (GH-106666)
pythongh-106602: [Enum] Add __copy__ and __deepcopy__ (pythonGH-106666)
pythongh-106602: [Enum] Add __copy__ and __deepcopy__ (pythonGH-106666)
[3.12] gh-106602: [Enum] Add __copy__ and __deepcopy__ (GH-106695)
[3.11] gh-106602: [Enum] Add __copy__ and __deepcopy__ (GH-106694)
ethanfurman commentedon Jul 12, 2023
Thanks, @Agent-Hellboy, for the help!
Agent-Hellboy commentedon Jul 13, 2023
Thanks @ethanfurman, looking forward to contributions like these.
Add betterproto.Enum __copy__ and __deepcopy__ implementations
Add betterproto.Enum __copy__ and __deepcopy__ implementations (#566)
Add betterproto.Enum __copy__ and __deepcopy__ implementations (#566)