0

我正在学习部分以及何时使用它们。在这个关于partials vs lambdaspartials的页面中,接受的答案解释了over的优点之一lambdas,即 partials 具有对内省有用的属性。所以我们可以用部分做以下事情:

import functools
f = functools.partial(int, base=2)
print f.args, f.func, f.keywords

((), int, {'base': 2})

事实上,我们不能这样做lambdas

h = lambda x : int(x,base=2)
print h.args, h.func, h.keywords

AttributeError: 'function' object has no attribute 'args'

但实际上,我们也不能用“普通”的 Python 函数来做到这一点:

def g(x) :
  return int(x,base=2) 
print g.args, g.func, g.keywords

AttributeError: 'function' object has no attribute 'args'

为什么 partials 比普通的 Python 函数有更多的功能?这种设计的意图是什么?内省是否被认为对正常功能无用?

4

1 回答 1

5

函数确实有关于它们接受哪些参数的信息。属性名称和数据结构更多地针对解释器而不是开发人员,但信息在那里。您必须反省.func_defaultsand.func_code.co_varnames结构(以及其他一些结构)才能找到这些细节。

使用该inspect.getargspec()函数可以更直接地提取信息:

>>> import inspect
>>> h = lambda x : int(x,base=2)
>>> inspect.getargspec(h)
ArgSpec(args=['x'], varargs=None, keywords=None, defaults=None)

请注意, a生成的对象类型与函数语句生成lambda的对象类型完全相同。def funcname():

没有给你什么,是什么参数将被传递到被包装的函数中。这是因为一个函数具有更通用的用途,而functools.partial()它是专门的,因此可以轻松地为您提供该信息。因此,partial告诉您base=2将被传递给int(),但lambda只能告诉您它接收参数x

因此,虽然一个functools.partial()对象可以告诉你哪些参数将被传递给哪个函数,但一个对象只能告诉你它接收到哪些参数,因为它是构成函数function的(可能更复杂的)表达式的工作调用包装函数。那就是忽略所有那些根本不调用其他函数的函数。

于 2014-07-02T13:35:46.947 回答