<p>为什么不让它成为一个带有<code>__call__</code>的类呢?在</p>
<pre><code>class standardGenerator(object):
def __init__(self, param=8.0):
self.param = param
def __call__(self, obj):
# do stuff with obj and self.param
</code></pre>
<p>用户代码执行以下操作:</p>
^{pr2}$
<p>那么<code>opts.usersChoice</code>和以前一样是可调用的,只有<code>obj</code>的一个参数。在</p>
<p>编辑:如果您有几个函数,并且不想将它们全部转换为类,则可以创建一个包装类:</p>
<pre><code>class wrapper(object):
def __init__(self, func, **args):
self.func, self.args = func, args
def __call__(self, *args):
return self.func(*args, **self.kwargs)
</code></pre>
<p>然后,您的旧函数可以像以前一样“原始”使用,或者像这样用于用户定义的参数:</p>
^{4}$
<p>我认为第一个解决方案更干净,第二个方案可能开始重复<code>functools.partial</code>,但你明白了。在</p>
<p>编辑:你可以做的另一件事,可以说是邪恶的,就是使用操作符重载:</p>
<pre><code>class _standardGenerator(object):
def __init__(self, param = 8.0):
self.param = param
# overload << to make it look most evil
def __lshift__(self, other):
return _standardGenerator(other)
def __call__(self, obj):
# do stuff with self.param and obj
standardGenerator = _standardGenerator()
# user code for default
opts.usersChoice = standardGenerator
# user code for nondefault
opts.usersChoice = standardGenerator << 4.0
</code></pre>
<p>当然,我认为使用常规类并让用户自己实例化它会更干净,但是如果您不喜欢<code>standardGenerator</code>末尾的括号,那么这样的方法就可以了。在</p>