2012-05-14 23 views
12

Tôi hiện đang ở dấu vết pdb con số này raPython: tại sao có thể phục hồi trả về Sai, khi nào nó phải trả về True?

ipdb> isinstance(var, Type) 
False 
ipdb> type(var) 
<class 'module.Type'> 
ipdb> Type 
<class 'module.Type'> 

Tại sao điều này có thể xảy ra?

P. S. isinstance(var, type(var)) lợi nhuận như mong đợi True

+5

Có thể có nhiều loại được gọi là 'Loại' (nói tại các thời điểm khác nhau). Bạn có thể tạo ra một ví dụ hoàn chỉnh thể hiện được vấn đề không? – NPE

+10

có bất kỳ ma thuật 'import' /' reload' nào trong mã của bạn không? –

+0

@RomanBodnarchuk, tôi không nghĩ vậy. Bạn có thể cung cấp các ví dụ về ma thuật như vậy không? – Shark

Trả lời

13
  1. Tôi chỉ có thể đoán, nhưng nếu bạn làm trong module

    class Type(object): pass 
    var = Type() 
    class Type(object): pass 
    

    sau đó cả hai loại trông giống như <class 'module.Type'>, nhưng vẫn khác nhau.

    Bạn có thể kiểm tra điều đó với

    print(id(Type), id(var.__class__)) 
    

    hoặc với

    print(Type is var.__class__) 
    

    Lưu ý rằng những so sánh này làm việc cho cả hai old-, và các lớp học kiểu mới. Đối với các lớp học kiểu mới, chúng tương đương với print(Type is type(var)). Nhưng đây không phải là trường hợp cho các lớp học kiểu cũ.

  2. Một cái bẫy khá phổ biến là bạn gọi module này với

    python -m module 
    

    hoặc

    python module.py 
    

    làm cho nó được gọi là __main__ module. Nếu nó được nhập vào một nơi khác dưới tên thật của nó, nó được biết dưới tên đó cũng như với một không gian tên khác.

  3. Một giả định khác có thể là bạn đang làm việc với ABCs hoặc nếu không, hãy để lớp học có phương thức __instancecheck__().

+0

Tôi đã xác định chỉ một Loại trên tất cả các tệp nguồn của mình. Và tôi không sử dụng các phương pháp ẩn. Chỉ '__str__',' __iter__', '__len__'. Vì vậy, đây không phải là trường hợp. Ngoài ra, lớp này là lớp con của 'đối tượng'. – Shark

+0

BTW, tôi hiện đang ở phiên pdb. Tôi nên kiểm tra những gì để xác định nguyên nhân? – Shark

+0

Bạn có thể xem xét việc xem xét 'id (type (var))', 'type (var) là Type', v.v. –

Các vấn đề liên quan