Quick-reference recipe card - copy-paste ready.
"""ab_experiment.py - assignment, exposure logging, guardrails."""
from __future__ import annotations
import hashlib
from dataclasses import dataclass
from enum import Enum
class Variant ( str , Enum ):
A = "A"
B = "B"
@dataclass ( frozen = True )
class Experiment :
name: str
traffic_pct: int # B receives this percent
success_metric: str
guardrail_metrics: tuple[ str , ... ]
def assign_variant (user_id: str , exp: Experiment) -> Variant:
digest = hashlib.sha256( f " { exp.name } : { user_id } " .encode()).hexdigest()
bucket = int (digest[: 8 ], 16 ) % 100
return Variant.B if bucket < exp.traffic_pct else Variant.A
@dataclass
class ExposureEvent :
experiment: str
variant: Variant
user_id: str
def checkout_cta_label (user_id: str , exp: Experiment) -> tuple[ str , ExposureEvent]:
v = assign_variant(user_id, exp)
label = "Complete purchase" if v == Variant.B else "Checkout"
return label, ExposureEvent(exp.name, v, user_id)
if __name__ == "__main__" :
exp = Experiment( "checkout_cta" , 50 , "checkout_completed" , ( "p95_latency" , "error_rate" ))
print (checkout_cta_label( "user-42" , exp))
Stack versions: This page was written for Python 3.14.0 (stable 3.14, maintenance 3.13), FastAPI 0.115+ , Django 5.2 , Flask 3.1 , Pydantic 2 , PyTorch 2.6+ , pandas 2.2+ , Polars 1.x , ruff 0.9+ , and uv 0.6+ .