in domainbed/lib/query.py [0:0]
def make_selector_fn(selector):
"""
If selector is a function, return selector.
Otherwise, return a function corresponding to the selector string. Examples
of valid selector strings and the corresponding functions:
x lambda obj: obj['x']
x.y lambda obj: obj['x']['y']
x,y lambda obj: (obj['x'], obj['y'])
"""
if isinstance(selector, str):
if ',' in selector:
parts = selector.split(',')
part_selectors = [make_selector_fn(part) for part in parts]
return lambda obj: tuple(sel(obj) for sel in part_selectors)
elif '.' in selector:
parts = selector.split('.')
part_selectors = [make_selector_fn(part) for part in parts]
def f(obj):
for sel in part_selectors:
obj = sel(obj)
return obj
return f
else:
key = selector.strip()
return lambda obj: obj[key]
elif isinstance(selector, types.FunctionType):
return selector
else:
raise TypeError