Function string_import
from raimad.string_import
def string_import(import_str: str, multiple: bool = False) -> Any
Import a compo, specified by a string.
Parameters
----------
import_str : str
A string representing a component or an entire module.
The string is the the format
`module.module.module.[...].compo` to import a specific
compo,
or
`module.module.module.[...]` to import all compos
in an entire module
TODO finish this docstring
Click to show code
def string_import(import_str: str, multiple: bool = False) -> Any:
"""
Import a compo, specified by a string.
Parameters
----------
import_str : str
A string representing a component or an entire module.
The string is the the format
`module.module.module.[...].compo` to import a specific
compo,
or
`module.module.module.[...]` to import all compos
in an entire module
TODO finish this docstring
"""
module_str, _, attr_str = import_str.partition(':')
try:
module = importlib.import_module(module_str)
except ImportError as exc:
if exc.name != module_str:
raise exc from None
raise StringImportError(
f'Could not import module "{module_str}".'
)
if attr_str == '':
names = []
compos = []
for name, attr in module.__dict__.items():
if rai.is_compo_class(attr):
names.append(name)
compos.append(attr)
if not compos:
raise StringImportError(
f"Module {module} identified by `{module_str}` "
"does not have any raimad components inside of it."
)
elif multiple:
return compos
elif len(compos) == 1:
return compos[0]
else:
raise StringImportError(
f"Module {module} identified by `{module_str}` "
"has multiple components inside it: "
f"`{names}`. "
"You need to tell me which one you want."
)
else:
try:
attr = getattr(module, attr_str)
except AttributeError:
raise StringImportError(
f"Module {module} identified by `{module_str}` "
f"does not have an object called `{attr_str}`."
)
if not rai.is_compo_class(attr):
raise StringImportError(
f"Object `{attr}` of "
f"module {module} identified by `{module_str}` "
"is not a raimad component."
)
return attr