Maybe it could be modeled after NewType:
from typing import SealedLiteralType
# single source of truth:
HttpMethod = SealedLiteralType("HttpMethod", ["GET", "POST", "DELETE"])
assert list(iter(HttpMethod)) == ["GET", "POST", "DELETE"]
assert "GET" in HttpMethod
def f(m: HttpMethod): ...
f("GET") # type checker: OK
f("PUT") # type checker: Error