2014-04-28 10 views
5

Warum führt das folgende Beispiel nicht seinen Doctest in der Setter Methode ausführen?Python-2.7: Doctests ignoriert in Setter-Methode einer Klasse

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

Der Debugger bestätigt, dass kein Test durchgeführt wird (Beispiel oben auf dtest.py geschrieben):

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

Der gleiche Test in den Getter Verfahren korrekt ausgeführt wird, Ausfall natürlich berichten ...

Antwort

5

Der @a.setter Dekorator ignoriert den Docstring und er wird nicht in das resultierende Objekt property kopiert; Stellen Sie stattdessen den Docstring auf Getter.

Siehe property documentation:

Wenn gegeben, doc die docstring des Eigenschaftsattribut sein. Andernfalls wird die Eigenschaft fget's Docstring (falls vorhanden) kopieren.

Schwerpunkt meiner.

Ihr Code ergibt:

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

das docstring auf dem Getter Set jedoch und Sie erhalten:

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

Eine andere wäre hässlich Abhilfe zu erstellen, die Eigenschaft mit der docstring sein kopiert vom Setzer, explizit:

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

Ich sehe. Können Sie bitte der Vollständigkeit halber eine Referenz hinzufügen, die die Gründe, die ordnungsgemäße Verwendung usw. erläutert? Die [offizielle Dokumentation] (https://docs.python.org/2.7/library/doctest.html) bietet keine weiteren Informationen. – sphakka

+0

@sphakka: es tut tatsächlich; Ich habe den relevanten Teil zitiert. –