| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- 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
|