<p>这将打印所有可通过的参数、关键字和非关键字参数的名称:</p>
<pre><code>def func(one, two="value"):
y = one, two
return y
print func.func_code.co_varnames[:func.func_code.co_argcount]
</code></pre>
<p>这是因为第一个<code>co_varnames</code>始终是参数(下一个是局部变量,如上例中的<code>y</code>)。</p>
<p>所以现在你可以有一个函数:</p>
<pre><code>def getValidArgs(func, argsDict):
'''Return dictionary without invalid function arguments.'''
validArgs = func.func_code.co_varnames[:func.func_code.co_argcount]
return dict((key, value) for key, value in argsDict.iteritems()
if key in validArgs)
</code></pre>
<p>你可以这样使用:</p>
<pre><code>>>> func(**getValidArgs(func, args))
</code></pre>
<hr/>
<p><strong>编辑</strong>:一个小的附加:如果您真正只需要函数的关键字参数,则可以使用<code>func_defaults</code>属性提取它们:</p>
<pre><code>def getValidKwargs(func, argsDict):
validArgs = func.func_code.co_varnames[:func.func_code.co_argcount]
kwargsLen = len(func.func_defaults) # number of keyword arguments
validKwargs = validArgs[-kwargsLen:] # because kwargs are last
return dict((key, value) for key, value in argsDict.iteritems()
if key in validKwargs)
</code></pre>
<p>现在可以用已知的参数调用函数,但提取的参数为,例如:</p>
<pre><code>func(param1, param2, **getValidKwargs(func, kwargsDict))
</code></pre>
<p>这假设<code>func</code>在其签名中不使用<code>*args</code>或<code>**kwargs</code>魔法。</p>