2013-07-19 18 views
5

ho una riga di codice che è:Come prendere in giro un attributo mancante

if not hasattr(class.a, u'c'): 
    return 

Come faccio beffe fuori classe in modo che class.a.c restituisce False per hasattr?

Se faccio questo:

>>> from mock import MagicMock 
>>> mock_class = MagicMock(spec=[u'a']) 
>>> hasattr(mock_class, u'a') 
True 
>>> hasattr(mock_class, u'b') 
False 
>>> hasattr(mock_class.a, u'c') 
True 

Anche se io non class.a.c spec, il suo essere preso in giro !!!

+0

Perché non rimuoverlo con [delattr] (http://docs.python.org/2.7/library/functions.html?highlight=delattr#delattr)? – twil

+0

Ho usato: del mock_class.a.c alla fine. Grazie! –

risposta

3

In realtà mock_class.a creerà un altro MagicMock, che non ha una specifica. L'unico modo che mi viene in mente è quello di assegnare l'attributo a del mock_class con un altro MagicMock con spec, in questo modo:

mock_class = MagicMock(spec=[u'a']) 
mock_class.a = MagicMock(spec=[u'a']) 
hasattr(mock_class.a, u'c') # returns False 

anche se si dispone di alcuni oggetti reali che si desidera prendere in giro, v'è la possibilità di fare alcuni recursive autospecing.

+0

Avrei potuto giurare di averlo provato ma non ha funzionato, ma il tuo esempio ha funzionato! –

Problemi correlati