<p>使用inspect模块比直接检查代码对象并计算变量要好一点。</p>
<pre><code>>>> import inspect
>>> def func(a,b,c=42, *args, **kwargs): pass
>>> inspect.getargspec(func)
(['a', 'b', 'c'], 'args', 'kwargs', (42,))
</code></pre>
<p>如果您想知道它是否可以用一组特定的参数来调用,那么您需要的参数没有指定默认值。这些可以通过:</p>
<pre><code>def getRequiredArgs(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.
</code></pre>
<p>然后,一个函数可以告诉您在特定的dict中缺少什么:</p>
<pre><code>def missingArgs(func, argdict):
return set(getRequiredArgs(func)).difference(argdict)
</code></pre>
<p>同样,要检查无效参数,请使用:</p>
<pre><code>def invalidArgs(func, argdict):
args, varargs, varkw, defaults = inspect.getargspec(func)
if varkw: return set() # All accepted
return set(argdict) - set(args)
</code></pre>
<p>因此,如果它是可调用的,那么完整的测试是:</p>
<pre><code>def isCallableWithArgs(func, argdict):
return not missingArgs(func, argdict) and not invalidArgs(func, argdict)
</code></pre>
<p>(这只适用于python的arg解析。显然,无法检测到任何运行时检查kwargs中的无效值。)</p>