擅长:python、mysql、java
<p>当然。在Python中,函数可以采用位置参数或关键字参数。对于大多数函数,参数可以以任何一种方式传递,但这不一定适用于所有函数,因此我们确实需要将它们分开。位置参数在iterable(通常是列表或元组)中,关键字参数在从字符串到值的字典中。</p>
<p>然后,我们可以将每个函数表示为函数、位置参数和关键字参数的元组:</p>
<pre><code>options = {
0: (function_zero, [], {}),
1: (function_one, [], {}),
2: (function_two, [], {}),
3: (function_three, [True], {}),
4: (function_four, [], {'kwarg': True}), # takes a keyword argument
}
</code></pre>
<p>你可以这样称呼他们:</p>
<pre><code>func, args, kwargs = options[option1]
func(*args, **kwargs)
</code></pre>
<p>但是如果您总是要传入一个常量,那么有一个更好的方法:只需为每个调用函数<em>的函数创建一个小的无参数包装器您希望如何调用它:</p>
<pre><code>options = {
0: function_zero,
1: function_one,
2: function_two,
3: lambda: function_three(True),
4: lambda: function_four(kwarg=True),
}
</code></pre>
<p>然后使用第一种方法:</p>
<pre><code>options[option1]()
</code></pre>
<p>正如jornsharpe的答案中详细说明的,您还可以使用<code>functools.partial</code>,而不是<code>lambda</code>。正如他所指出的,这样做的好处是可以附加一些自己的论点:</p>
<pre><code>options[option1]('hello') # adds 'hello' to previously-specified arguments
</code></pre>
<p>不过,如果您不需要这个功能,零参数<code>lambda</code>将为您提供很好的服务。</p>