/
__init__.py
52 lines (39 loc) · 1.1 KB
/
__init__.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import inspect
from functools import wraps
class Manager(object):
def __init__(self):
self._registered = {}
def register(self, func):
"""
Register a dependency function
"""
self._registered[func.__name__] = func
return func
def remove(self, name):
"""
Remove a dependency by name
"""
del self._registered[name]
def get(self, name):
"""
Get a dependency by name, None if not registered
"""
return self._registered.get(name)
manager = Manager()
def register(func):
return manager.register(func)
def inject(func):
@wraps(func)
def wrapper(*args, **kwargs):
signature = inspect.signature(func)
params = signature.parameters
if not params:
return func(*args, **kwargs)
args = list(args)
for i, param in enumerate(signature.parameters):
service = manager.get(param)
if not service:
continue
args.insert(i, service())
return func(*args, **kwargs)
return wrapper