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方法中的相同测试,当然报告失败...
所述@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)
| 归档时间: |
|
| 查看次数: |
273 次 |
| 最近记录: |