所以我正在玩Python中的currying函数,我注意到的一件事就是functools.partial返回一个部分对象而不是一个实际的函数.令我恼火的事情之一是,如果我按照以下方式做了一些事情:
five = partial(len, 'hello')
five('something')
Run Code Online (Sandbox Code Playgroud)
然后我们得到
TypeError: len() takes exactly 1 argument (2 given)
Run Code Online (Sandbox Code Playgroud)
但我想要发生的是
TypeError: five() takes no arguments (1 given)
Run Code Online (Sandbox Code Playgroud)
是否有一种干净的方式让它像这样工作?我写了一个解决方法,但它对我的口味来说太过于hacky(对于使用varargs的函数还没有用):
def mypartial(f, *args):
argcount = f.func_code.co_argcount - len(args)
params = ''.join('a' + str(i) + ',' for i in xrange(argcount))
code = '''
def func(f, args):
def %s(%s):
return f(*(args+(%s)))
return %s
''' % (f.func_name, params, params, f.func_name)
exec code in locals()
return func(f, args)
Run Code Online (Sandbox Code Playgroud)
编辑:我认为如果我添加更多上下文可能会有所帮助.我正在写一个装饰器,它会自动调整一个这样的函数:
@curry
def add(a, b, c):
return a + b + …Run Code Online (Sandbox Code Playgroud)