比直接检查代码对象并计算变量更好一点的是使用检查模块。
>>> import inspect
>>> def func(a,b,c=42, *args, **kwargs): pass
>>> inspect.getargspec(func)
(['a', 'b', 'c'], 'args', 'kwargs', (42,))
如果您想知道它是否可以使用一组特定的参数进行调用,则需要未指定默认值的参数。这些可以通过以下方式获得:
def get_required_args(func):
args, varargs, varkw, defaults = inspect.getargspec(func)
if defaults:
args = args[:-len(defaults)]
return args # *args and **kwargs are not required, so ignore them.
然后,告诉您特定字典中缺少什么的函数是:
def missing_args(func, argdict):
return set(get_required_args(func)).difference(argdict)
同样,要检查无效参数,请使用:
def invalid_args(func, argdict):
args, varargs, varkw, defaults = inspect.getargspec(func)
if varkw: return set() # All accepted
return set(argdict) - set(args)
因此,如果它是可调用的,完整的测试是:
def is_callable_with_args(func, argdict):
return not missing_args(func, argdict) and not invalid_args(func, argdict)
(这仅就 python 的 arg 解析而言是好的。任何运行时都会检查中的无效值kwargs
显然无法检测到。)