2014-12-14 26 views
6

ho una classe denominata Factor nel modulo Factor.py (https://github.com/pgmpy/pgmpy/blob/dev/pgmpy/factors/Factor.py) e hanno anche la funzione denominata factor_product in Factor.py come:strano comportamento della funzione isinstance

def factor_product(*args): 
    if not all(isinstance(phi, Factor) for phi in args): 
      raise TypeError("Input parameters must be factors") 
    return functools.reduce(lambda phi1, phi2: _bivar_factor_operation(phi1, phi2,  
                  operation='M'), args) 

Ora, se ho anche passare istanze di Factor alla funzione, getta ancora TypeError. Poche righe dal debugger con breakpoint impostato sopra l'istruzione if:

(Pdb) args 
args = (<pgmpy.factors.Factor.Factor object at 0x7fed0faf76a0>, <pgmpy.factors.Factor.Factor object at 0x7fed0faf7da0>) 

(Pdb) isinstance(args[0], Factor) 
False 

(Pdb) type(args[0]) 
<class 'pgmpy.factors.Factor.Factor'> 

(Pdb) Factor 
<class 'pgmpy.factors.Factor.Factor'> 

Qualche idea del motivo?

+2

indovinata: hai mai chiamato "ricarica"? – Eevee

+0

@Eevee: Ah .. Stavo usando l'estensione 'reload' di ipython. Molte grazie. –

risposta

6

reload è un buon metodo per finire con due copie della stessa classe dello stesso modulo: uno da prima della ricarica (se tutte le istanze di tale classe sono ancora in agguato) e uno dopo.

Molto probabilmente si avevano oggetti del nuovo tipo, ma il numero Factor faceva riferimento al vecchio tipo, poiché è stato importato qualche tempo fa. Quindi è completamente vero che i tuoi oggetti non sono istanze di Factor ... non cheFactor, comunque.

Mai fidarsi di reload. :)

0

Come isinstance Restituisce vero se l'argomento oggetto è un'istanza dell'argomento classinfo, o di una sottoclasse (diretto, indiretto o virtuale) della stessa, semplicemente restituire vero se si passa l'istanza della classe ad esso non il classe stessa, vedere il seguente esempio:

>>> class A : 
... pass 
... 
>>> isinstance(A,A) 
False 
>>> isinstance(A(),A) 
True 
>>> z=A() 
>>> isinstance(z,A) 
True 
+0

la sessione pdb mostra che sono oggetti, non il tipo – Eevee