I have a Python class that contains a state field. To define all possible states, I have declared a nested enumeration:
class Foo:
class State(enum.Enum):
Unloaded = enum.auto()
Loaded = enum.auto()
Processed = enum.auto()
state: State
However, it is a bit cumbersome to write code like this:
if foo.state == Foo.State.Unloaded:
do_something_with(foo)
foo.state = Foo.State.Loaded
I want to make the enumeration members accessible directly as members of Foo (like Foo.Unloaded, Foo.Loaded and Foo.Processed). Is there a better way than just assigning them by hand?
class Foo:
class State(enum.Enum):
Unloaded = enum.auto()
Loaded = enum.auto()
Processed = enum.auto()
Unloaded = State.Unloaded
Loaded = State.Loaded
Processed = State.Processed
state: State
Sure, you can always dynamically do something like this. But why nest the enum at all then?
Or, without the loop:
Note, in general, nesting class definitions is not a common construct in Python. Even if I wanted something like your original approach (I happen to think requiring
Foo.State.whateveris not cumbersome but good if you are going to have nesting), then you would just do:Which is probably what I would use if I wanted that. But frankly, I would probably just leave state at the same level as
Foo. So what I would probably just use is: