File size: 1,830 Bytes
ad16788 |
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 53 54 55 56 57 58 |
import inspect
class Invalid:
"""Marker object for not serializable-object"""
def get_default_kwargs(func):
"""Get the default values of the input function.
Examples:
>>> def func(a, b=3): pass
>>> get_default_kwargs(func)
{'b': 3}
"""
def yaml_serializable(value):
# isinstance(x, tuple) includes namedtuple, so type is used here
if type(value) is tuple:
return yaml_serializable(list(value))
elif isinstance(value, set):
return yaml_serializable(list(value))
elif isinstance(value, dict):
if not all(isinstance(k, str) for k in value):
return Invalid
retval = {}
for k, v in value.items():
v2 = yaml_serializable(v)
# Register only valid object
if v2 not in (Invalid, inspect.Parameter.empty):
retval[k] = v2
return retval
elif isinstance(value, list):
retval = []
for v in value:
v2 = yaml_serializable(v)
# If any elements in the list are invalid,
# the list also becomes invalid
if v2 is Invalid:
return Invalid
else:
retval.append(v2)
return retval
elif value in (inspect.Parameter.empty, None):
return value
elif isinstance(value, (float, int, complex, bool, str, bytes)):
return value
else:
return Invalid
# params: An ordered mapping of inspect.Parameter
params = inspect.signature(func).parameters
data = {p.name: p.default for p in params.values()}
# Remove not yaml-serializable object
data = yaml_serializable(data)
return data
|