mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	bpo-44356: [Enum] allow multiple data-type mixins if they are all the same (GH-26649) (GH-26652)
This enables, for example, two base Enums to both inherit from `str`, and then both be mixed into the same final Enum:
    class Str1Enum(str, Enum):
        GH- some behavior here
    class Str2Enum(str, Enum):
        GH- some more behavior here
    class FinalStrEnum(Str1Enum, Str2Enum):
        GH- this now works
(cherry picked from commit 8a4f0850d7)
Co-authored-by: Ethan Furman <ethan@stoneleaf.us>
Co-authored-by: Ethan Furman <ethan@stoneleaf.us>
			
			
This commit is contained in:
		
							parent
							
								
									175ebc60d5
								
							
						
					
					
						commit
						304ec53b53
					
				
					 3 changed files with 52 additions and 4 deletions
				
			
		|  | @ -556,7 +556,7 @@ def _get_mixins_(class_name, bases): | |||
|             return object, Enum | ||||
| 
 | ||||
|         def _find_data_type(bases): | ||||
|             data_types = [] | ||||
|             data_types = set() | ||||
|             for chain in bases: | ||||
|                 candidate = None | ||||
|                 for base in chain.__mro__: | ||||
|  | @ -564,19 +564,19 @@ def _find_data_type(bases): | |||
|                         continue | ||||
|                     elif issubclass(base, Enum): | ||||
|                         if base._member_type_ is not object: | ||||
|                             data_types.append(base._member_type_) | ||||
|                             data_types.add(base._member_type_) | ||||
|                             break | ||||
|                     elif '__new__' in base.__dict__: | ||||
|                         if issubclass(base, Enum): | ||||
|                             continue | ||||
|                         data_types.append(candidate or base) | ||||
|                         data_types.add(candidate or base) | ||||
|                         break | ||||
|                     else: | ||||
|                         candidate = base | ||||
|             if len(data_types) > 1: | ||||
|                 raise TypeError('%r: too many data types: %r' % (class_name, data_types)) | ||||
|             elif data_types: | ||||
|                 return data_types[0] | ||||
|                 return data_types.pop() | ||||
|             else: | ||||
|                 return None | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Miss Islington (bot)
						Miss Islington (bot)