I have this python code. But why does it print "NEW" in the first case, and "Status.NEW" in the second case?
import enum
class Status(str, enum.Enum):
"""Status options."""
NEW = "NEW"
EXCLUDED = "EXCLUDED"
print("" + Status.NEW)
print(Status.NEW)
This is a quirk of multiple inheritance (one of the reasons why a lot of people choose to shun it).
print("" + Status.NEW)
Here you're using the +
operator on your Status.NEW
object. Since Status inherits from str
, it inherits the __add__
method from there. str.__add__
does string concatenation and uses its raw string value.
print(Status.NEW)
Here there's no string concatenation, but print
calls the __str__
method on any object you pass to it. Your Status.NEW
object inherits its __str__
method from the Enum side of the family, so in that context it gets printed as an Enum value instead of a string.
If you're in Python 3.11 or greater, you can do this:
import enum
class Status(enum.StrEnum):
"""Status options."""
NEW = "NEW"
EXCLUDED = "EXCLUDED"
print("" + Status.NEW)
print(Status.NEW)
That avoids ambiguity about whether your objects are treated as Enums or strings. Otherwise, you just have to be careful.