@@ -109,6 +109,19 @@ def __iter__(self) -> Iterator[X]:
109
109
"""Iterate over the registered elements."""
110
110
return iter (self .lookup_dict .values ())
111
111
112
+ def subresolver (self , keys : Iterable [str ]) -> "BaseResolver[X, Y]" :
113
+ """Create a resolver that's a subset of this one."""
114
+ elements = [
115
+ self .lookup_str (key )
116
+ for key in keys
117
+ ]
118
+ return self .__class__ (
119
+ elements = elements ,
120
+ default = self .default ,
121
+ synonyms = self .synonyms ,
122
+ suffix = self .suffix ,
123
+ )
124
+
112
125
@property
113
126
def options (self ) -> Set [str ]:
114
127
"""Return the normalized option names."""
@@ -172,6 +185,17 @@ def register(
172
185
def lookup (self , query : Hint [X ], default : Optional [X ] = None ) -> X :
173
186
"""Lookup an element."""
174
187
188
+ def lookup_str (self , query : str ) -> X :
189
+ """Lookup an element by name."""
190
+ key = self .normalize (query )
191
+ if key in self .lookup_dict :
192
+ return self .lookup_dict [key ]
193
+ elif key in self .synonyms :
194
+ return self .synonyms [key ]
195
+ else :
196
+ valid_choices = sorted (self .options )
197
+ raise KeyError (f"{ query } is an invalid. Try one of: { valid_choices } " )
198
+
175
199
def docdata (self , query : Hint [X ], * path : str , default : Optional [X ] = None ):
176
200
"""Lookup an element and get its docdata.
177
201
0 commit comments