2014-04-28 18 views
5

Perché nell'esempio seguente non viene eseguito il doctest nel metodo setter?python-2.7: doctest ignorato nel metodo setter di una classe

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

Il debugger conferma che nessun test viene eseguito (nell'esempio sopra scritto dtest.py):

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

Lo stesso test nel getter metodo sia correttamente eseguito, segnalazione guasti, naturalmente ...

risposta

5

Il decoratore @a.setter ignora la docstring e non viene copiato nell'oggetto property risultante; impostare invece la docstring sull'agente .

Vedere il property documentation:

Se dato, doc sarà la docstring dell'attributo proprietà. In caso contrario, la proprietà copierà la docstring di fget (se esistente).

Enfasi mia.

Risultati di codice in:

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

Impostare la docstring sul getter comunque e si ottiene:

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

altro, brutto soluzione potrebbe essere quella di ricreare la proprietà con il docstring essere copiato dal setter, esplicitamente:

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

Vedo. Per completezza, potresti aggiungere qualsiasi riferimento che spieghi la motivazione, l'uso corretto, ecc.? La [documentazione ufficiale] (https://docs.python.org/2.7/library/doctest.html) non fornisce ulteriori informazioni. – sphakka

+0

@sphakka: lo fa, in realtà; Ho citato la parte pertinente. –