lazy
allennlp.common.lazy
T#
T = TypeVar("T")
Lazy#
class Lazy(Generic[T]):
| def __init__(self, constructor: Union[Type[T], Callable[..., T]])
This class is for use when constructing objects using FromParams
, when an argument to a
constructor has a sequential dependency with another argument to the same constructor.
For example, in a Trainer
class you might want to take a Model
and an Optimizer
as arguments,
but the Optimizer
needs to be constructed using the parameters from the Model
. You can give
the type annotation Lazy[Optimizer]
to the optimizer argument, then inside the constructor
call optimizer.construct(parameters=model.parameters)
.
This is only recommended for use when you have registered a @classmethod
as the constructor
for your class, instead of using __init__
. Having a Lazy[]
type annotation on an argument
to an __init__
method makes your class completely dependent on being constructed using the
FromParams
pipeline, which is not a good idea.
The actual implementation here is incredibly simple; the logic that handles the lazy
construction is actually found in FromParams
, where we have a special case for a Lazy
type
annotation.
@classmethod
def my_constructor(
cls,
some_object: Lazy[MyObject],
optional_object: Lazy[MyObject] = None,
required_object_with_default: Lazy[MyObject] = Lazy(MyObjectDefault),
) -> MyClass:
obj1 = some_object.construct()
obj2 = None if optional_object is None else optional_object.construct()
obj3 = required_object_with_default.construct()
construct#
class Lazy(Generic[T]):
| ...
| def construct(self, **kwargs) -> T