Daily Python-URL是每天都会去看看的网站,今天看到了有人在ASPN上写了一个SimpleWrapper来实现对函数预先设定参数的功能。他的程序结构大概如下:
在后面的评述中还看到一个采用Closure的实现:
class SimpleWrapper:看了以后觉得还不错,不想到在后面的评论中,居然提到了就有现成的模块Partial.py,可以从Xoltar.org下载。而这个模块的实现基础如下,非常简单:
class MethodCall: def __init__(self, function, *params): self.function = function self.default_params = params def __call__(self, *params): return self.function(*(self.default_params + params))
def __init__(self, ns, *params): self.params = params self.ns = ns
def __getattr__(self, attr): return SimpleWrapper.MethodCall(self.ns[attr], *self.params);
class partial(object): def __init__(*args, **kw): self = args[0] self.fn, self.args, self.kw = (args[1], args[2:], kw) def __call__(self, *args, **kw): if kw and self.kw: d = self.kw.copy() d.update(kw) else: d = kw or self.kw return self.fn(*(self.args + args), **d)
在后面的评述中还看到一个采用Closure的实现:
def curry(fn, *cargs, **ckwargs): def call_fn(*fargs, **fkwargs): d = ckwargs.copy() d.update(fkwargs) return fn(*(cargs + fargs), **d) return call_fn到底哪种实现更加有效率?还没有看到统一的意见。