[3.9] bpo-42517: [Enum] deprecate private name members (GH-23722) (GH-23748)

private names will raise a DeprecationWarning; in 3.10 they will become normal attributes
This commit is contained in:
Miss Islington (bot) 2020-12-14 15:56:58 -08:00 committed by GitHub
parent 6b2ed38509
commit aba12b67c1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 51 additions and 0 deletions

View file

@ -41,6 +41,19 @@ def _is_sunder(name):
name[-2:-1] != '_'
)
def _is_private(cls_name, name):
# do not use `re` as `re` imports `enum`
pattern = '_%s__' % (cls_name, )
if (
len(name) >= 5
and name.startswith(pattern)
and name[len(pattern)] != '_'
and (name[-1] != '_' or name[-2] != '_')
):
return True
else:
return False
def _make_class_unpicklable(cls):
"""
Make the given class un-picklable.
@ -81,6 +94,14 @@ class _EnumDict(dict):
Single underscore (sunder) names are reserved.
"""
if _is_private(self._cls_name, key):
import warnings
warnings.warn(
"private variables, such as %r, will be normal attributes in 3.10"
% (key, ),
DeprecationWarning,
stacklevel=2,
)
if _is_sunder(key):
if key not in (
'_order_', '_create_pseudo_member_',
@ -146,6 +167,7 @@ class EnumMeta(type):
metacls._check_for_existing_members(cls, bases)
# create the namespace dict
enum_dict = _EnumDict()
enum_dict._cls_name = cls
# inherit previous flags and _generate_next_value_ function
member_type, first_enum = metacls._get_mixins_(cls, bases)
if first_enum is not None: