部分函数应用程序与Python中的原始docstring?

时间:2014-12-08 16:46:46

标签: python partial-application

对于partial function application,我知道在Python中有几种方法可以做到这一点。但是,它们似乎不会保留原始函数的文档字符串。

functools.partial为例:

from functools import partial

def foo(a, b, c=1):
    """Return (a+b)*c."""
    return (a+b)*c

bar10_p = partial(foo, b=10)
print bar10_p.__doc__

partial(func, *args, **keywords) - new function with partial application 
of the given arguments and keywords.

让我们试试fn.py

from fn import F

def foo(a, b, c=1):
    """Return (a+b)*c."""
    return (a+b)*c

bar10_F = F(foo, b=10)
print bar10_F.__doc__

Provide simple syntax for functions composition
(through << and >> operators) and partial function
application (through simple tuple syntax).

Usage example:

>>> func = F() << (_ + 10) << (_ + 5)
>>> print(func(10))
25
>>> func = F() >> (filter, _ < 6) >> sum
>>> print(func(range(10)))
15

是否有任何Python包/模块提供保留docstring的部分应用程序?

更新

提到@Kevin@Martijn Pieters时,函数签名已更改,因此不建议您坚持使用原始函数的docstring。我意识到我正在寻找一个像foo() with a default b value of 10这样的更新文档字符串(感谢Kevin简单而直接的例子。)。

4 个答案:

答案 0 :(得分:10)

__doc__partial个对象和函数上都是可写的;只需复制一遍:

bar10_p = partial(foo, b=10)
bar10_p.__doc__ = func.__doc__

或使用functools.update_wrapper() function为您复制;它也会为你复制一些其他的元数据:

from functools import update_wrapper

bar10_p = partial(foo, b=10)
update_wrapper(bar10_p, foo)

答案 1 :(得分:2)

只需撰写新的__doc__

bar10_p = partial(foo, b=10)
bar10_p.__doc__ = """foo() with a default b value of 10.

See foo().

"""

您的函数与原始函数的界面不同,因此不应该完全复制文档字符串。

答案 2 :(得分:2)

Partial可以访问func方法,这是原始函数。因此,通过原始函数,您可以访问原始函数docstring。

试试这个:

from math import cos
from functools import partial

cos_partial = partial(cos, 0.5)
print(cos_partial.func.__doc__)

答案 3 :(得分:0)

使用makefun,您可以做到:

from makefun import partial

def foo(a, b, c=1):
    """Return (a+b)*c."""
    return (a + b) * c

bar10_p = partial(foo, b=10)

assert bar10_p(0) == 10
assert bar10_p(0, c=2) == 20 
help(bar10_p)

它产生:

Help on function foo in module makefun.tests.test_so:

foo(a, c=1)
    <This function is equivalent to 'foo(a, c=1, b=10)', see original 'foo' doc below.>
    Return (a+b)*c.

请注意,如果您对文档字符串的更新方式有任何评论,请随时在git repo上提出问题!

(顺便说一下,我是作者)