2014-12-14 38 views
6

Tôi có một lớp có tên Factor trong module Factor.py (https://github.com/pgmpy/pgmpy/blob/dev/pgmpy/factors/Factor.py) và cũng có chức năng đặt tên factor_product trong Factor.py như:hành vi kỳ lạ của chức năng 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) 

Bây giờ nếu tôi thậm chí còn vượt qua trường hợp của Factor đến chức năng, nó vẫn ném TypeError. Một vài dòng từ trình gỡ lỗi có điểm ngắt được đặt phía trên câu lệnh 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'> 

Bất kỳ ý tưởng nào về việc này xảy ra?

+2

phỏng đoán hoang dã: bạn có bao giờ gọi 'tải lại' không? – Eevee

+0

@Eevee: Ah .. Tôi đang sử dụng phần mở rộng 'reload' của ipython. Cảm ơn rất nhiều. –

Trả lời

6

reload là một cách tốt để kết thúc với hai bản sao của lớp tương tự từ các module giống nhau: một từ trước khi tải lại (nếu có trường hợp của lớp đó vẫn còn rình rập về) và một từ sau.

Rất có thể bạn đã có đối tượng thuộc loại mới, nhưng Factor được gọi là loại cũ, vì nó đã được nhập một thời gian trước đây. Do đó, hoàn toàn đúng là đối tượng của bạn không phải là các trường hợp của Factor ... không phải rằngFactor, anyway.

Không bao giờ tin tưởng reload. :)

0

Như isinstance Return true nếu đối tượng là một thể hiện của đối số classinfo, hoặc của một lớp con (trực tiếp, gián tiếp hay ảo) của chúng, nó chỉ trả về true nếu bạn vượt qua các thể hiện của lớp học của bạn để nó không phải là lớp tự, xem ví dụ sau:

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

phiên pdb cho thấy rằng chúng là đối tượng, không phải loại – Eevee