@@ -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 :
0 commit comments