Comparing Python enums to Java, was: How much sanity checking is required for function inputs?
Ethan Furman
ethan at stoneleaf.us
Thu May 5 15:52:21 EDT 2016
On 04/24/2016 08:20 AM, Ian Kelly wrote:
> On Sun, Apr 24, 2016 at 1:20 AM, Ethan Furman wrote:
>> What fun things can Java enums do?
>
> Everything that Python enums can do, plus:
>
>--> Planet.EARTH.value
> (5.976e+24, 6378140.0)
>--> Planet.EARTH.surface_gravity
> 9.802652743337129
>
> This is incredibly useful, but it has a flaw: the value of each member
> of the enum is just the tuple of its arguments. Suppose we added a
> value for COUNTER_EARTH describing a hypothetical planet with the same
> mass and radius existing on the other side of the sun. [1] Then:
>
>--> Planet.EARTH is Planet.COUNTER_EARTH
> True
If using Python 3 and aenum 1.4.1+, you can do
--> class Planet(Enum, settings=NoAlias, init='mass radius'):
... MERCURY = (3.303e+23, 2.4397e6)
... VENUS = (4.869e+24, 6.0518e6)
... EARTH = (5.976e+24, 6.37814e6)
... COUNTER_EARTH = EARTH
... @property
... def surface_gravity(self):
... # universal gravitational constant (m3 kg-1 s-2)
... G = 6.67300E-11
... return G * self.mass / (self.radius * self.radius)
...
--> Planet.EARTH.value
(5.976e+24, 6378140.0)
--> Planet.EARTH.surface_gravity
9.802652743337129
--> Planet.COUNTER_EARTH.value
(5.976e+24, 6378140.0)
--> Planet.COUNTER_EARTH.surface_gravity
9.802652743337129
>>> Planet.EARTH is Planet.COUNTER_EARTH
False
> * Speaking of AutoNumber, since Java enums don't have the
> instance/value distinction, they effectively do this implicitly, only
> without generating a bunch of ints that are entirely irrelevant to
> your enum type. With Python enums you have to follow a somewhat arcane
> recipe to avoid specifying values, which just generates some values
> and then hides them away. And it also breaks the Enum alias feature:
>
>--> class Color(AutoNumber):
> ... red = default = () # not an alias!
> ... blue = ()
> ...
Another thing you could do here:
--> class Color(Enum, settings=AutoNumber):
... red
... default = red
... blue
...
--> list(Color)
[<Color.red: 1>, <Color.blue: 2>]
--> Color.default is Color.red
True
--
~Ethan~
More information about the Python-list
mailing list