对于通过包和直接从同一模块导入的类型,isinstance失败

对于通过包和直接从同一模块导入的类型,isinstance失败,第1张

对于通过包和直接从同一模块导入的类型,isinstance失败

您不应该同时制作

lib
一个程序包并将其添加到中
PYTHONPATH
。这样就可以
lib.
直接或直接导入其模块,从而为失败做好准备。

如你看到的,

lib.Types.Custom != Types.Custom

因为Python导入的工作方式。

Python搜索导入路径并解析其找到的适当条目。

  • 导入时
    lib.Types
    ,它将
    lib
    目录导入为一个包,然后导入
    lib/Types.py
    为其中的子模块,
    lib
    lib.Types
    在中创建模块对象
    sys.modules
  • 当您导入
    Types
    ,它导入
    Types.py
    作为一个独立的模块,创建模块对象
    Types
    sys.modules

所以,

Types
lib.Types
最终成为两个不同的模块对象。Python不会检查它们是否是同一文件,以使事情变得简单并避免再次猜测。

(这实际上在Python的import System中的Unwary陷阱中列为“双重导入陷阱”。)


如果

lib
从中删除
PYTHONPATH
,则导入
lib/foo.py
将需要成为相对导入:

from .Types import Custom

或绝对导入:

from lib.Types import Custom


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5664670.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存