I like the NamedValue/namedvalue recipe. I prefer module constants like os.SEEK_END to nested names like os.Seek.End and this encourages that. If someone decides to change os module to:
SEEK_END = namedvalue('SEEK_END', 2)
that won't break anything. For the simple enum case, a decorator could transform
@enum
class Color:
red = 1
green = 2
into:
class Color:
red = namedvalue('Color.red', 1)
green = namedvalue('Color.green', 2)