On 04/16/2017 01:24 AM, Steven D'Aprano wrote:
On Fri, Apr 14, 2017 at 06:06:29PM -0700, Stephan Hoyer wrote:

One way that I've found myself using enums recently is for dispatching (as
keys in a dictionary) between different interchangeable functions or
classes.

[...]

Given that wanting to use a function as the enumeration value is quite
unusual in the first place, I don't think this belongs in the standard
library.

I agree with D'Aprano: such unusual usage does not belong in the stdlib.

Fortunately, there is the Advanced Enumeration (aenum) library*:

--- 8< -----------------------------------------------------------------
from aenum import Enum, enum

class CallableEnum(Enum):

    def __new__(cls, *args, **kwds):
        member = object.__new__(cls)
        member._impl = args[0]
        if member._impl.__doc__ is not None:
            member._value_ = member._impl.__doc__
        else:
            member._value_ = repr(member._impl)
        return member

    def __call__(self, *args, **kwds):
        return self._impl(*args, **kwds)
--- 8< -----------------------------------------------------------------

and in use

--- 8< -----------------------------------------------------------------
class TestEnum(CallableEnum):

    @enum
    def hello(text):
        "a pleasant greeting"
        print('hello,', text)

    @enum
    def goodbye(text):
        print('goodbye,', text)

list(TestEnum)
# [
#  <TestEnum.hello: 'a pleasant greeting'>,
#  <TestEnum.goodbye: '<function goodbye at 0xb7264844>'>,
# ]

print(TestEnum.hello)
# TestEnum.hello

TestEnum.hello('how are you?')
# 'hello, how are you?'

TestEnum.goodbye('see you soon!')
# 'goodbye, see you soon!'
--- 8< -----------------------------------------------------------------

Note that it is possible to do the same thing using the stdlib Enum if you create your own decorator (it must return a class instance) and a slight rewrite of __new__ -- but I'll leave that as an exercise for the reader.

--
~Ethan~


* Disclosure: I am the primary author of the stdlib Enum; I am also the author if the enum34 backport and the aenum library.

enum34: https://pypi.python.org/pypi/enum34
 aenum: https://pypi.python.org/pypi/aenum
_______________________________________________
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to