Skip to content

Instantly share code, notes, and snippets.

@mypy-play
Created November 12, 2025 09:41
Show Gist options
  • Save mypy-play/a3f72d7c250e50e04dce3f0ef95c7aff to your computer and use it in GitHub Desktop.
Save mypy-play/a3f72d7c250e50e04dce3f0ef95c7aff to your computer and use it in GitHub Desktop.
Shared via mypy Playground
from typing import Generic, TypeVar, Literal
from dataclasses import dataclass
T = TypeVar('T')
class RequestTypeToken(Generic[T]):
"""Token that proves a request type has been registered."""
def __init__(self, type_name: T):
self.name = type_name
print(type(type_name))
@dataclass
class Request(Generic[T]):
token: RequestTypeToken[T]
# other fields...
class C:
def __init__(self):
self._registered_types: set[T] = set()
def create_request_type(self, type_name: T) -> RequestTypeToken[T]:
"""Register a type and return a token."""
self._registered_types.add(type_name)
return RequestTypeToken(type_name)
def send_request(self, request: Request) -> None:
"""Send a request - validates token is registered."""
if request.token.name not in self._registered_types:
raise ValueError(f"Type '{request.token.name}' not registered")
print(f"Sending request of type: {request.token.name}")
# Usage
c = C()
# Register and get tokens
foo : Literal["foo"] = "foo"
foo_token = c.create_request_type(foo)
# Create requests with tokens
foo_req = Request(token=foo_token)
c.send_request(foo_req)
type(foo_token)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment