mirror of
https://github.com/modelscope/FunASR
synced 2025-09-15 14:48:36 +08:00
58 lines
1.8 KiB
Python
58 lines
1.8 KiB
Python
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
|