Functions as Enum member values

Colin McPhail colin.mcphail at mac.com
Mon May 31 13:50:40 EDT 2021



> On 31 May 2021, at 18:24, Peter Otten <__peter__ at web.de> wrote:
> 
> On 31/05/2021 17:57, Colin McPhail via Python-list wrote:
>> Hi,
>> According to the enum module's documentation an Enum-based enumeration's members can have values of any type:
>> 	"Member values can be anything: int, str, etc.."
> 
> You didn't read the fineprint ;)
> 
Ah, neither I did.

> """
> The rules for what is allowed are as follows: names that start and end with a single underscore are reserved by enum and cannot be used; all other attributes defined within an enumeration will become members of this enumeration, with the exception of special methods (__str__(), __add__(), etc.), descriptors (methods are also descriptors), and variable names listed in _ignore_
> """"
> 
> Functions written in Python are descriptors and therefore cannot be used. Builtin functions aren't, leading to the following somewhat surprising difference:
> 
> >>> def foo(self): print("foo")
> 
> >>> class A(Enum):
> 	x = foo  # foo.__get__ exists -> foo is a descriptor
>                 # the enum library assumes you are adding a
>                 # method to your
>                 # class, not an enumeration value.
> 
> 	y = sum  # no sum.__get__ attribute -> function
>                 # treated as an enumeration value.
> 
> >>> list(A)
> [<A.y: <built-in function sum>>]
> >>> A.x
> <function foo at 0x012096A0>
> >>> A.y
> <A.y: <built-in function sum>>
> >>> A.y.x()
> foo
> 
Thank you for explaining it.

Regards,
Colin



More information about the Python-list mailing list