22

我目前正在 pdb 跟踪中解决这个问题

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

为什么会发生这种情况?

PS按预期isinstance(var, type(var))返回True

4

3 回答 3

23
  1. 我只能猜测,但如果你这样做module

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

    那么这两种类型看起来都像<class 'module.Type'>,但仍然不同。

    你可以检查一下

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

    或与

    print(Type is var.__class__)
    

    请注意,这些比较适用于旧式和新式类。对于新式类,它们等价于print(Type is type(var)). 但对于旧式类,情况并非如此。

  2. 另一个很常见的陷阱是你调用这个模块

    python -m module
    

    或者

    python module.py
    

    使其称为__main__模块。如果它是以其真实名称在其他地方导入的,那么它也以该名称以及不同的名称空间为人所知。

  3. 另一个猜测可能是您正在使用ABC或以其他方式让该类具有__instancecheck__()方法。

于 2012-05-14T11:54:12.890 回答
6

iPython 中“autoreload”设置的用户可能会遇到这种情况。当一个类被重新加载时,它将成为一个具有完全相同名称的新类。旧类的实例不会更新其类型:

# After reloading the Role class

[ins] In [19]: y = Role()

[ins] In [20]: isinstance(x, Role)
Out[20]: False

[nav] In [21]: isinstance(y, Role)
Out[21]: True

[ins] In [22]: type(x)
Out[22]: myproject.auth.Role

[ins] In [23]: type(y)
Out[23]: myproject.auth.Role
于 2020-09-28T19:45:19.623 回答
0

我也遇到了这个问题,因为我的进口问题。我Type曾经parent.child.Typechild.Type. 我假设当使用完整路径时,模块是从已安装的 pip 包中导入的,而使用相对路径时,它会作为新模块即时导入。

于 2021-12-09T15:57:57.680 回答