Source code for climb.tool.impl.data_suite.third_party.uq360.base
import logging
from typing import Any, List, Optional, Union
[docs]
class Base(object):
"""Base class that represents a generic plugin with subtypes that are
referenced by name and instantiated at runtime."""
[docs]
@classmethod
def name(cls) -> Union[str, List[str]]:
"""Name of this subtype, used for lookup purposes. To be implemented by subclasses.
This method can either return a single name, or a list/tuple of names."""
raise NotImplementedError()
[docs]
@classmethod
def instance(cls, discriminator: Any, **params) -> "PluginBase":
return cls._instance(discriminator, **params)
@classmethod
def _instance(cls, discriminator: Any, **params) -> "PluginBase":
for subclazz in cls.__subclasses__():
inst = subclazz.try_instantiate(discriminator, **params)
if inst:
return inst
# recursive call for subclass
try:
return subclazz._instance(discriminator, **params)
except Exception as e:
if not isinstance(e, NotImplementedError):
logging.warning('Unable to instantiate %s subtype "%s": %s' % (subclazz.__name__, discriminator, e))
print(e)
raise NotImplementedError('Unable to find or create %s type "%s"' % (cls.__name__, discriminator))
[docs]
@classmethod
def try_instantiate(cls, discriminator: Any, **params) -> Optional["PluginBase"]:
"""Return an instance of this subtype, if it is capable of handling the given discriminator, otherwise None.
By default, this method assumes that "discriminator" is a subtype name, and returns an instance if
the discriminator matches the name of this subtype (as returned by the `name()` method).
This method can be overwritten by subclasses, in which case the discriminator can also be any
other object based on which the subtype class can decide whether it is responsible
for handling it."""
try:
name = cls.name()
except Exception:
name = None
if name == discriminator or (is_list_or_tuple(name) and discriminator in name):
return cls(**params)
[docs]
def is_list_or_tuple(obj):
"""Determine whether an object is an iterable list or tuple"""
return isinstance(obj, (list, tuple))