from typing import Any, Optional REQUEST_RETURN_LENGTHS = { "loglikelihood": 2, "greedy_until": None, "loglikelihood_rolling": None, } class Request: def __init__( self, request_type: str, args: Optional[Any] = None, index: Optional[int] = None ): if request_type not in REQUEST_RETURN_LENGTHS.keys(): raise NotImplementedError( "The request type {} is not implemented!".format(request_type) ) self.request_type = request_type self.args = args self.index = index def __iter__(self): if REQUEST_RETURN_LENGTHS[self.request_type] is None: raise IndexError("This request type does not return multiple arguments!") for i in range(REQUEST_RETURN_LENGTHS[self.request_type]): yield Request(self.request_type, self.args, i) def __getitem__(self, i: int): if REQUEST_RETURN_LENGTHS[self.request_type] is None: raise IndexError("This request type does not return multiple arguments!") return Request(self.request_type, self.args, i) def __eq__(self, other: "Request"): return ( self.request_type == other.request_type and self.args == other.args and self.index == other.index ) def __repr__(self): return f"Req_{self.request_type}{self.args}[{self.index}]\n" class RequestFactory: def __getattr__(self, attr): def fn(*args): return Request(attr, args) return fn rf = RequestFactory()