对于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简单而直接的例子。)。
答案 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上提出问题!
(顺便说一下,我是作者)