2014-04-28 10 views
5

Dlaczego następujący przykład nie uruchamia swojego testu w metodzie ustawiającej?python-2.7: doctesty ignorowane w metodzie setera klasy

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() 

Debuger potwierdza, że ​​żaden test prowadzony jest (przykład powyżej zapisywane dtest.py):

>>> import dtest, doctest 
>>> doctest.testmod(dtest) 
TestResults(failed=0, attempted=0) 

Ten sam test w getter metody jest poprawnie wykonana, niewydolność oczywiście raportowanie ...

Odpowiedz

5

Dekorator @a.setter ignoruje docstring i nie jest kopiowany do wynikowego obiektu property; zamiast tego ustaw docstring na getter.

Zobacz property documentation:

Jeśli podana, doc będzie docstring atrybutu nieruchomości. W przeciwnym razie, właściwość skopiuje docget fget's (jeśli istnieje).

Podkreślam moją.

Wyniki kod w:

>>> 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 

Ustaw docstring na getter jednak i masz:

>>> 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  ' 

Innym, brzydki obejście byłoby odtworzyć działce z docstring bycia skopiowane z ustawiacza, jawnie:

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__) 
+0

Rozumiem. W celu zapewnienia kompletności, proszę dodać wszelkie odniesienia wyjaśniające uzasadnienie, właściwe użycie itp.? Oficjalna dokumentacja (https://docs.python.org/2.7/library/doctest.html) nie zawiera więcej informacji. – sphakka

+0

@sphakka: faktycznie tak; Zacytowałem odpowiednią część. –

Powiązane problemy