<div dir="ltr">Enums are great. They allow you cleanly define a set of statically defined options.<div><br></div><div>One way that I've found myself using enums recently is for dispatching (as keys in a dictionary) between different interchangeable functions or classes. My code looks something like this:</div><div><br></div><div><font face="monospace, monospace">from enum import Enum</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">def foo(...):</font></div><div><font face="monospace, monospace">    ...</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">def bar(...):</font></div><div><font face="monospace, monospace">    ...</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">class Implementation(Enum):</font></div><div><font face="monospace, monospace">    FOO = 1</font></div><div><font face="monospace, monospace">    BAR = 2</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">_IMPLEMENTATIONS = {</font></div><div><font face="monospace, monospace">    Implementation.FOO: foo,</font></div><div><font face="monospace, monospace">    Implementation.BAR: bar,</font></div><div><font face="monospace, monospace">}</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">def call_implementation(implementation, *args, **kwargs):</font></div><div><font face="monospace, monospace">    return </font><span style="font-family:monospace,monospace">_IMPLEMENTATIONS</span><font face="monospace, monospace">[implementation](*args, **kwargs)</font></div><div><br></div><div>The first part of this blog post does a nice job of summarizing the general use case:<br></div><div><a href="http://lukasz.langa.pl/8/single-dispatch-generic-functions/">http://lukasz.langa.pl/8/single-dispatch-generic-functions/</a><br></div><div><br></div><div>Obviously, enums are better than strings, because they're static declared and already grouped together. But it would be nice if we could do one better, by eliminating the dictionary, moving the dictionary values to the enum and making the enum instances.</div><div><br></div><div>You might try this by writing a small subclass of Enum:</div><div><br></div><div><div><font face="monospace, monospace">class CallableEnum(Enum):</font></div><div><font face="monospace, monospace">    def __call__(self, *args, **kwargs):</font></div><div><font face="monospace, monospace">        return self.value(*args, **kwargs)</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">class Implementation(CallableEnum):</font></div><div><font face="monospace, monospace">    FOO = foo</font></div><div><font face="monospace, monospace">    BAR = bar</font></div><div><br></div><div><font face="monospace, monospace">def call_implementation(implementation, *args, **kwargs):</font></div><div><font face="monospace, monospace">    return </font><font face="monospace, monospace">implementation(*args, **kwargs)</font></div></div><div><br></div><div>This looks great, with the Enum serving essentially as a typed namespace for a group of related functions, but unfortunately it this doesn't work. The problem is that when you assign a function to an Enum, it treats it as a method instead of an enum value:</div><div><a href="http://stackoverflow.com/questions/40338652/how-to-define-enum-values-that-are-functions">http://stackoverflow.com/questions/40338652/how-to-define-enum-values-that-are-functions</a><br></div><div><br></div><div>Instead, you need to wrap function values in a callable class, e.g.,</div><div><br></div><div><span style="font-family:monospace,monospace">from functools import partial</span></div><div><span style="font-family:monospace,monospace"><br></span></div><div><span style="font-family:monospace,monospace">class Implementation(CallableEnum):</span><br></div><div><div><font face="monospace, monospace">    FOO = partial(foo)</font></div><div><font face="monospace, monospace">    BAR = partial(bar)</font></div></div><div><font face="monospace, monospace"><br></font></div>This is OK, but definitely uglier and more error prone than necessary. It's easy to forget to add a partial, which results in an accidental method declaration.<div><br></div><div>It would be nice to have a CallableEnum class that works like Enum, but adds the __call_ method and doesn't allow defining any new methods: all functions assigned in the class body become Enum instances instead of methods.<div><div><br></div><div>I would write this myself and throw it up on pypi, but there doesn't seem to be any way to do this short of delving into <a href="https://github.com/python/cpython/blob/0dc5c3169dcd4853612d11ed8c92b12fa210c07f/Lib/enum.py#L93">the guts of enum.EnumMeta</a>. Given that I think that others will also find this pattern useful, rather than forking the enum module I would like to add this into the standard library instead.</div><div><br></div><div>Note: this proposal would also allow defining enum values using "def" inside the Enum body. But I think this is actually pretty clean, aside from general enum confusion over the fact that Implementation.FOO is Enum instance, not the method.</div></div></div><div><br></div><div><font face="monospace, monospace">class Implementation(CallableEnum):</font></div><div><font face="monospace, monospace">    def FOO(...):<br></font></div><div><font face="monospace, monospace">        ...</font></div><div><font face="monospace, monospace">    def BAR(...):</font></div><div><font face="monospace, monospace">        ...</font></div></div>