@@ -15,9 +15,15 @@ class NoRegistrationExistsError(ValueError):
15
15
16
16
17
17
class Registry (Generic [T ]):
18
- def __init__ (self ):
18
+ """
19
+ A simple generic registry that allows for registering and retrieving items by key. Reverse lookup by value is enabled by default.
20
+ If you have duplicate values, you may want to disable reverse lookup.
21
+ """
22
+
23
+ def __init__ (self , enable_reverse_lookup = True ):
19
24
self .registrations : dict [str , T ] = {}
20
25
self .reverse_lookup : dict [T , str ] = {}
26
+ self .enable_reverse_lookup = enable_reverse_lookup
21
27
22
28
def register (self , key : str ):
23
29
def inner (item : T ) -> T :
@@ -26,13 +32,14 @@ def inner(item: T) -> T:
26
32
f"A registration already exists for { key } : { self .registrations [key ]} "
27
33
)
28
34
29
- if item in self .reverse_lookup :
30
- raise AlreadyRegisteredError (
31
- f"A registration already exists for { item } : { self .reverse_lookup [item ]} "
32
- )
35
+ if self .enable_reverse_lookup :
36
+ if item in self .reverse_lookup :
37
+ raise AlreadyRegisteredError (
38
+ f"A registration already exists for { item } : { self .reverse_lookup [item ]} "
39
+ )
40
+ self .reverse_lookup [item ] = key
33
41
34
42
self .registrations [key ] = item
35
- self .reverse_lookup [item ] = key
36
43
37
44
return item
38
45
@@ -44,6 +51,8 @@ def get(self, key: str) -> T:
44
51
return self .registrations [key ]
45
52
46
53
def get_key (self , item : T ) -> str :
54
+ if not self .enable_reverse_lookup :
55
+ raise NotImplementedError ("Reverse lookup is not enabled" )
47
56
if item not in self .reverse_lookup :
48
57
raise NoRegistrationExistsError (f"No registration exists for { item } " )
49
58
return self .reverse_lookup [item ]
0 commit comments