python-2.7:在类的setter方法中忽略doctests

sph*_*kka 5 python setter doctest properties python-2.7

为什么以下示例无法在setter方法中运行doctest ?

class Foo:
    a = None

    @property
    def a(self):
        pass

    @a.setter
    def a(self, v):
        '''
        >>> 1 == 1
        False
        '''
        pass

if __name__ == "__main__":
    import doctest
    doctest.testmod()
Run Code Online (Sandbox Code Playgroud)

调试器确认没有运行测试(上面写的示例dtest.py):

>>> import dtest, doctest
>>> doctest.testmod(dtest)
TestResults(failed=0, attempted=0)
Run Code Online (Sandbox Code Playgroud)

正确执行getter方法中的相同测试,当然报告失败...

Mar*_*ers 5

所述@a.setter装饰忽略文档字符串并且它不会被复制到所产生的property对象; 改为在getter上设置docstring .

查看property文档:

如果给定,doc将是property属性的docstring.否则,该属性将复制fget的docstring(如果存在).

强调我的.

您的代码会导致:

>>> class Foo:
...     a = None
...     @property
...     def a(self):
...         pass
...     @a.setter
...     def a(self, v):
...         '''
...         >>> 1 == 1
...         False
...         '''
...         pass
...
>>> Foo.a
<property object at 0x101a21050>
>>> Foo.a.__doc__ is None
True
Run Code Online (Sandbox Code Playgroud)

但是在getter上设置docstring 然后你会得到:

>>> class Foo:
...     a = None
...     @property
...     def a(self):
...         '''
...         >>> 1 == 1
...         False
...         '''
...         pass
...     @a.setter
...     def a(self, v):
...         pass
... 
>>> Foo.a
<property object at 0x101a210a8>
>>> Foo.a.__doc__
'\n        >>> 1 == 1\n        False\n        '
Run Code Online (Sandbox Code Playgroud)

另一个丑陋的解决方法是重新创建属性,并显式地从setter复制docstring:

class Foo:
    a = None

    @property
    def a(self):
        pass

    @a.setter
    def a(self, v):
        '''
        >>> 1 == 1
        False
        '''
        pass

    a = property(a.fget, a.fset, doc=a.fset.__doc__)
Run Code Online (Sandbox Code Playgroud)