2014-12-14 19 views
6

Mam klasy o nazwie Factor w module Factor.py (https://github.com/pgmpy/pgmpy/blob/dev/pgmpy/factors/Factor.py), a także mieć funkcję o nazwie factor_product w Factor.py jak:Dziwne zachowanie funkcji 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) 

Teraz gdybym nawet przechodzić wystąpień Factor do funkcji, nadal rzuca TypeError. Kilka linii od debuggera z punktem przerwania tuż nad instrukcją 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'> 

Czy masz pomysł, dlaczego tak się dzieje?

+2

dzikie domysły: czy kiedykolwiek nazywasz 'przeładowanie'? – Eevee

+0

@Eevee: Ah .. Używałem rozszerzenia 'reload' dla ipythona. Wielkie dzięki. –

Odpowiedz

6

reload jest dobrym sposobem kończą się dwie kopie tej samej klasy z jednym module: jeden sprzed przeładowania (jeśli wszystkie przypadki tej klasy są wciąż czai się wokoło) i jeden od następnego.

Najprawdopodobniej miałeś obiekty nowego typu, ale Factor odnosiło się do starego typu, ponieważ zostało zaimportowane jakiś czas temu. Więc jest całkowicie prawdą, że twoje obiekty nie są przypadkami Factor ... a nie , tak czy inaczej.

Nigdy nie ufaj reload. :)

0

Jak isinstance return true, jeśli argument obiekt jest instancją argumentu classinfo lub z (bezpośrednie, pośrednie lub wirtualnego) podklasy ich, po prostu zwróci true jeśli przejdą instancję klasy do niego nie samej klasy patrz poniższy przykład:

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

sesja pdb pokazuje, że są obiektami, a nie typem – Eevee