2012-05-14 12 views
12

Jestem obecnie w pdb śladu rysunek toPython: dlaczego isinstance może zwracać Fałsz, kiedy powinien zwracać True?

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

Dlaczego tak się stało?

P. S. isinstance(var, type(var)) powraca True jak oczekiwano

+5

Istnieje wiele typów znanych jako "Typ" (powiedzmy w różnych punktach czasowych). Czy możesz przedstawić kompletny przykład, który pokazuje problem? – NPE

+10

czy w twoim kodzie jest jakaś magia 'import' /' reload'? –

+0

@RomanBodnarchuk, nie sądzę. Czy możesz podać przykłady takiej magii? – Shark

Odpowiedz

13
  1. Mogę się tylko domyślać, ale jeśli nie w module

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

    następnie oba typy wyglądać <class 'module.Type'>, ale są jednak różne.

    Można sprawdzić, które z

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

    lub

    print(Type is var.__class__) 
    

    Zauważ, że te porównania działają zarówno stare-i klas w nowym stylu. Dla klas w nowym stylu są one równoważne z print(Type is type(var)). Ale tak nie jest w przypadku klas w starym stylu.

  2. Kolejną pułapką jest dość powszechne, że nazywają to moduł z

    python -m module 
    

    lub

    python module.py 
    

    co znane jako moduł __main__. Jeśli jest importowany gdzie indziej pod swoją prawdziwą nazwą, jest również znany pod tą samą nazwą z inną przestrzenią nazw.

  3. Innym domysłem może być to, że pracujesz z ABCs lub w inny sposób niech klasa ma metodę __instancecheck__().

+0

Zdefiniowałem tylko jeden typ we wszystkich moich plikach źródłowych. I nie mam do czynienia z ukrytymi metodami. Tylko '__str__',' __iter__', '__len__'. Tak nie jest. Również ta klasa jest podklasą 'obiektu'. – Shark

+0

BTW, jestem obecnie w sesji pdb. Co powinienem sprawdzić, aby ustalić przyczynę? – Shark

+0

Możesz rozważyć spojrzenie na 'id (type (var))', 'type (var) is Type', itp. –

Powiązane problemy