Merge branch 'main' into per-interpreter-alloc · python/cpython@22758a3 (original) (raw)
`@@ -201,23 +201,13 @@ def get(self, instance, ownerclass=None):
`
201
201
` )
`
202
202
`else:
`
203
203
`if self.fget is None:
`
204
``
`-
if self.member is None: # not sure this can happen, but just in case
`
``
204
`+
look for a member by this name.
`
``
205
`+
try:
`
``
206
`+
return ownerclass.member_map[self.name]
`
``
207
`+
except KeyError:
`
205
208
`raise AttributeError(
`
206
209
`'%r has no attribute %r' % (ownerclass, self.name)
`
207
210
` )
`
208
``
`-
issue warning deprecating this behavior
`
209
``
`-
import warnings
`
210
``
`-
warnings.warn(
`
211
``
`` -
"member.member
access (e.g. Color.RED.BLUE
) is "
``
212
``
`-
"deprecated and will be removed in 3.14.",
`
213
``
`-
DeprecationWarning,
`
214
``
`-
stacklevel=2,
`
215
``
`-
)
`
216
``
`-
return self.member
`
217
``
`-
XXX: uncomment in 3.14 and remove warning above
`
218
``
`-
raise AttributeError(
`
219
``
`-
'%r member has no attribute %r' % (ownerclass, self.name)
`
220
``
`-
)
`
221
211
`else:
`
222
212
`return self.fget(instance)
`
223
213
``
`@@ -314,22 +304,32 @@ def set_name(self, enum_class, member_name):
`
314
304
` ):
`
315
305
`# no other instances found, record this member in member_names
`
316
306
`enum_class.member_names.append(member_name)
`
317
``
`-
get redirect in place before adding to member_map
`
318
``
`-
but check for other instances in parent classes first
`
319
``
`-
descriptor = None
`
``
307
`+
if necessary, get redirect in place and then add it to member_map
`
``
308
`+
found_descriptor = None
`
320
309
`for base in enum_class.mro[1:]:
`
321
310
`descriptor = base.dict.get(member_name)
`
322
311
`if descriptor is not None:
`
323
312
`if isinstance(descriptor, (property, DynamicClassAttribute)):
`
``
313
`+
found_descriptor = descriptor
`
324
314
`break
`
325
``
`-
redirect = property()
`
326
``
`-
redirect.member = enum_member
`
327
``
`-
redirect.set_name(enum_class, member_name)
`
328
``
`-
if descriptor:
`
329
``
`-
redirect.fget = getattr(descriptor, 'fget', None)
`
330
``
`-
redirect.fset = getattr(descriptor, 'fset', None)
`
331
``
`-
redirect.fdel = getattr(descriptor, 'fdel', None)
`
332
``
`-
setattr(enum_class, member_name, redirect)
`
``
315
`+
elif (
`
``
316
`+
hasattr(descriptor, 'fget') and
`
``
317
`+
hasattr(descriptor, 'fset') and
`
``
318
`+
hasattr(descriptor, 'fdel')
`
``
319
`+
):
`
``
320
`+
found_descriptor = descriptor
`
``
321
`+
continue
`
``
322
`+
if found_descriptor:
`
``
323
`+
redirect = property()
`
``
324
`+
redirect.member = enum_member
`
``
325
`+
redirect.set_name(enum_class, member_name)
`
``
326
`+
earlier descriptor found; copy fget, fset, fdel to this one.
`
``
327
`+
redirect.fget = found_descriptor.fget
`
``
328
`+
redirect.fset = found_descriptor.fset
`
``
329
`+
redirect.fdel = found_descriptor.fdel
`
``
330
`+
setattr(enum_class, member_name, redirect)
`
``
331
`+
else:
`
``
332
`+
setattr(enum_class, member_name, enum_member)
`
333
333
`# now add to member_map (even aliases)
`
334
334
`enum_class.member_map[member_name] = enum_member
`
335
335
`try:
`