Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1"""Import related utilities.""" 

2from __future__ import absolute_import, unicode_literals 

3 

4import importlib 

5import sys 

6 

7from kombu.five import reraise, string_t 

8 

9 

10def symbol_by_name(name, aliases=None, imp=None, package=None, 

11 sep='.', default=None, **kwargs): 

12 """Get symbol by qualified name. 

13 

14 The name should be the full dot-separated path to the class:: 

15 

16 modulename.ClassName 

17 

18 Example:: 

19 

20 celery.concurrency.processes.TaskPool 

21 ^- class name 

22 

23 or using ':' to separate module and symbol:: 

24 

25 celery.concurrency.processes:TaskPool 

26 

27 If `aliases` is provided, a dict containing short name/long name 

28 mappings, the name is looked up in the aliases first. 

29 

30 Examples: 

31 >>> symbol_by_name('celery.concurrency.processes.TaskPool') 

32 <class 'celery.concurrency.processes.TaskPool'> 

33 

34 >>> symbol_by_name('default', { 

35 ... 'default': 'celery.concurrency.processes.TaskPool'}) 

36 <class 'celery.concurrency.processes.TaskPool'> 

37 

38 # Does not try to look up non-string names. 

39 >>> from celery.concurrency.processes import TaskPool 

40 >>> symbol_by_name(TaskPool) is TaskPool 

41 True 

42 """ 

43 aliases = {} if not aliases else aliases 

44 if imp is None: 

45 imp = importlib.import_module 

46 

47 if not isinstance(name, string_t): 

48 return name # already a class 

49 

50 name = aliases.get(name) or name 

51 sep = ':' if ':' in name else sep 

52 module_name, _, cls_name = name.rpartition(sep) 

53 if not module_name: 

54 cls_name, module_name = None, package if package else cls_name 

55 try: 

56 try: 

57 module = imp(module_name, package=package, **kwargs) 

58 except ValueError as exc: 

59 reraise(ValueError, 

60 ValueError("Couldn't import {0!r}: {1}".format(name, exc)), 

61 sys.exc_info()[2]) 

62 return getattr(module, cls_name) if cls_name else module 

63 except (ImportError, AttributeError): 

64 if default is None: 

65 raise 

66 return default