我试图以某种方式获取部分方法的文档。我目前的代码是
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-objects和https://docs.python.org/3/library/functools.html#functools.partialmethod,但这是否意味着无法将文档转换为部分方法,或者我对此过于愚蠢?
答案 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"
是否是个好主意,因为它可能会复制一堆无效的属性,超出我在我的示例中修改的属性。