使用functools partialmethod定义的函数的文档

时间:2015-10-07 14:23:14

标签: python

我试图以某种方式获取部分方法的文档。我目前的代码是

from functools import partialmethod

class Fun(object):

  def test(self, num):
    """
    I have a documentation
    """
    return num

  test2 = partialmethod(test, num=10)
  test2.__doc__ = """Blub"""

  test3 = partialmethod(test, num=20)

但如果我跑

a = Fun()
a.test2.__doc__ # only returns the partials documentation not "Blub"
Fun.test2.__doc__ # gives nothing

并且Sphinx使用autoclass作为undocumented members列出它们。

我已阅读https://docs.python.org/3/library/functools.html#partial-objectshttps://docs.python.org/3/library/functools.html#functools.partialmethod,但这是否意味着无法将文档转换为部分方法,或者我对此过于愚蠢?

1 个答案:

答案 0 :(得分:1)

无法在partialmethod对象上设置文档字符串。这是因为partialmethod是用Python编写的类,类的实例从类的__doc__获取文档字符串,而不是从实例的__doc__属性获取。函数的行为不同,正在查看函数对象的__doc__属性。

根据您对partialmethod的使用有多复杂,您可以编写自己的版本来返回函数而不是实例,从而允许您通过分配{{1}来自定义文档属性。

这是一个快速版本,我只与基本测试一起抛出。我认为它适用于常见情况(例如,__doc__是一个实际函数),但它可能不会像常规func类型那样灵活,所以你应该仔细检查它是否能完成所有事情需要它做:

partialmethod

import functools def my_partialmethod(func, *args1, **kwargs1): @functools.wraps(func) # copy attributes to start, they can be overwritten later def method(self, *args2, **kwargs2): return func(self, *args1, *args2, **kwargs1, **kwargs2) return method 的调用中的多次解包只在Python 3.5中是合法的。在较旧的Python版本中,您必须自己将参数合并为:

func

以下是一个使用示例:

    def method(self, *args2, **kwargs2):
        kwargs = kwargs1.copy()
        kwargs.update(kwargs2)
        return func(self, *(args1+args2), **kwargs)

您当然可以选择要覆盖的属性。我不确定使用class Test(object): def method1(self, arg): "docstring1" print(arg) method2 = my_partial_method(method1, "foo") method2.__name__ = "method2" method2.__doc__ = "docstring2" method3 = my_partial_method(method1, arg="bar") method3.__name__ = "method3" method3.__doc__ = "docstring3" 是否是个好主意,因为它可能会复制一堆无效的属性,超出我在我的示例中修改的属性。