Source code for eval_framework.tasks.lazy
from collections.abc import Callable, Sequence
from typing import TYPE_CHECKING, Any
from eval_framework.tasks.task import EvalFactory, ResponseType, Task
from template_formatting.formatter import BaseFormatter
if TYPE_CHECKING:
from eval_framework.metrics.base import BaseMetric
[docs]
class Lazy(EvalFactory):
"""An ``EvalFactory`` that defers producing the real factory until first use.
Holds an ``id`` and a ``load`` thunk returning the wrapped ``EvalFactory``; every
other call is delegated to that factory, which is built (and memoized) on first
access. This keeps ``Lazy`` independent of any concrete task type — the thunk owns
whatever loading (e.g. importing a module) the wrapped factory requires.
"""
def __init__(self, id: str, load: Callable[[], EvalFactory]) -> None:
self._id = id
self._load = load
self._factory: EvalFactory | None = None
def _loaded_factory(self) -> EvalFactory:
if self._factory is None:
self._factory = self._load()
return self._factory
[docs]
def id(self) -> str:
return self._id
[docs]
def create(
self,
num_fewshot: int,
custom_subjects: list[str] | None,
custom_hf_revision: str | None,
user_prompt_suffix: str | None = None,
seed: int | None = None,
) -> Task:
return self._loaded_factory().create(num_fewshot, custom_subjects, custom_hf_revision, user_prompt_suffix, seed)
[docs]
def response_type(self) -> ResponseType:
return self._loaded_factory().response_type()
[docs]
def metrics(self) -> list[type["BaseMetric"]]:
return self._loaded_factory().metrics()
[docs]
def subjects(self) -> list[Any]:
return self._loaded_factory().subjects()
[docs]
def display_name(self) -> str:
return self._loaded_factory().display_name()
[docs]
def markdown_doc(self, formatters: Sequence[BaseFormatter]) -> str:
return self._loaded_factory().markdown_doc(formatters)