小编eps*_*lon的帖子

为什么functools.partial没有返回真正的函数(以及如何创建一个函数)?

所以我正在玩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)

python function currying partial

9
推荐指数
1
解决办法
1891
查看次数

标签 统计

currying ×1

function ×1

partial ×1

python ×1