21from __future__
import annotations
23__all__ = [
"ConfigurableAction",
"ActionTypeVar"]
25from typing
import Any, TypeVar
30ActionTypeVar = TypeVar(
"ActionTypeVar", bound=
'ConfigurableAction')
34 """A `ConfigurableAction` is an interface that extends a
35 `lsst.pex.config.Config` class to include a `__call__` method.
37 This interface
is designed to create an action that can be used at
38 runtime
with state that
is determined during the configuration stage. A
39 single action thus may be assigned multiple times, each
with different
42 This allows state to be set
and recorded at configuration time,
43 making future reproduction of results easy.
45 This
class is intended to be an interface only, but because of various
46 inheritance conflicts this
class can not be implemented as an Abstract
47 Base Class. Instead, the `__call__` method
is purely virtual, meaning that
48 it will
raise a `NotImplementedError` when called. Subclasses that
49 represent concrete actions must provide an override.
52 identity: str | None =
None
53 """If a configurable action is assigned to a `ConfigurableActionField`, or a
54 `ConfigurableActionStructField` the name of the field will be bound to this
55 variable when it is retrieved.
58 def __setattr__(self, attr, value, at=None, label="assignment"):
59 if attr ==
'identity':
60 return object.__setattr__(self, attr, value)
63 def __call__(self, *args: Any, **kwargs: Any) -> Any:
64 raise NotImplementedError(
"This method should be overloaded in subclasses")
def __setattr__(self, attr, value, at=None, label="assignment")
Any __call__(self, *Any args, **Any kwargs)