"""Import related utilities."""from__future__importannotationsimportimportlibimportsysfromkombu.exceptionsimportreraise
[文档]defsymbol_by_name(name,aliases=None,imp=None,package=None,sep='.',default=None,**kwargs):"""Get symbol by qualified name. The name should be the full dot-separated path to the class:: modulename.ClassName Example:: celery.concurrency.processes.TaskPool ^- class name or using ':' to separate module and symbol:: celery.concurrency.processes:TaskPool If `aliases` is provided, a dict containing short name/long name mappings, the name is looked up in the aliases first. Examples -------- >>> symbol_by_name('celery.concurrency.processes.TaskPool') <class 'celery.concurrency.processes.TaskPool'> >>> symbol_by_name('default', { ... 'default': 'celery.concurrency.processes.TaskPool'}) <class 'celery.concurrency.processes.TaskPool'> # Does not try to look up non-string names. >>> from celery.concurrency.processes import TaskPool >>> symbol_by_name(TaskPool) is TaskPool True """aliases={}ifnotaliaseselsealiasesifimpisNone:imp=importlib.import_moduleifnotisinstance(name,str):returnname# already a classname=aliases.get(name)ornamesep=':'if':'innameelsesepmodule_name,_,cls_name=name.rpartition(sep)ifnotmodule_name:cls_name,module_name=None,packageifpackageelsecls_nametry:try:module=imp(module_name,package=package,**kwargs)exceptValueErrorasexc:reraise(ValueError,ValueError(f"Couldn't import {name!r}: {exc}"),sys.exc_info()[2])returngetattr(module,cls_name)ifcls_nameelsemoduleexcept(ImportError,AttributeError):ifdefaultisNone:raisereturndefault