Skip to content

Enums

Enums declare a fixed set of named variants. They are compile-time constants, not objects.

Declaring an enum

enum TokenKind:
IDENT
NUMBER
EOF

Variants are implicitly ordered starting from 0. There are no explicit numeric assignments.

Using enum values

enum TokenKind:
IDENT
NUMBER
EOF
class Token:
kind: TokenKind
text: str
def is_ident(kind: TokenKind) -> bool:
return kind == TokenKind.IDENT
def main() -> None:
kind = TokenKind.NUMBER
kinds: list[TokenKind] = [TokenKind.IDENT, TokenKind.EOF]
token = Token(TokenKind.IDENT, "x")
names: dict[TokenKind, str] = {
TokenKind.IDENT: "id",
TokenKind.NUMBER: "num"
}
print(kind)
print(kinds)
print(token)
print(names)
print(is_ident(token.kind))

Printing

Enum values print by variant name:

def main() -> None:
print(TokenKind.IDENT) # IDENT

Module-qualified access

When importing from another module:

from shapes import Color
def main() -> None:
c = Color.RED
print(c)
import shapes
def main() -> None:
c = shapes.Color.RED
print(c)

Limits

  • Enum definitions are module-scope only.
  • No methods on enums.
  • No explicit numeric values.
  • Up to 64 variants per enum.
  • Enums cannot participate in general unions (only Enum | None is supported).