> 文档中心 > 【ModuleNotFoundError & ImportError】之__init__.py

【ModuleNotFoundError & ImportError】之__init__.py

目录

  • 1 前言
  • 2 为什么有的文件夹下有 __ init__.py 而有的文件夹却没有?
  • 3 __ init__.py 意味着什么?
    • 3.1. 与包(package)的分类有关
  • 4 如何创建 __ init__.py?
  • 5 __ init__.py 的作用汇总
    • 5.1 包的标识
  • 5.2 执行包的初始化代码
    • 5.3 设置 __ all__ 变量
  • 6 总结

1 前言

提示:这里可以添加本文要记录的大概内容:

Spyder 和 PyCharm都用,但经常会出现这样的情况:一个脚本文件在 Spyder 里写成的,到 PyCharm 就会报错。常遇见的错误无非就是 ModuleNotFoundError、KeyError、ImportError。由此,翻看了大量的程序员笔记,也查看了 Python 官方文档,从官方定义中了解到 __init __.py 这个文件的一些作用,在此分享。


2 为什么有的文件夹下有 __ init__.py 而有的文件夹却没有?

在这里插入图片描述
用 PyCharm 会在创建新文件夹时给出两种选择:Directory & Python package。Directory 被创建之后,无__init__.py,而 Python package 被创建之后,有__init__.py。同时,Python package 被创建之后,文件夹图标上有一个圆点。

不过用 Spyder 创建文件夹,既不会有图标上的圆点,也不会自动创建 __ init__.py。

3 __ init__.py 意味着什么?

3.1. 与包(package)的分类有关

Python 区分了两种类型的包: Regular packages 常规包 和 Namespace packages 命名空间包。常规包通常以一个包含 __ init__.py 文件的目录形式实现。当一个常规包被导入时,这个 __ init__.py 文件会被隐式地执行,它所定义的对象会被绑定到该包命名空间中的名称。命名空间包没有 parent/__ init__.py 文件。

4 如何创建 __ init__.py?

我现在已经习惯了,用 PyCharm 创建文件夹,带圆点和 __ init__.py,用 Spyder 编写脚本。其实,也可以手动创建:新建文本文件,再修改其名称为 __ init__.py。

5 __ init__.py 的作用汇总

5.1 包的标识

空文件即可。Python 只把含 __init __.py 文件的目录当成包。这样可以防止以 string 等通用名称命名的目录,无意中屏蔽出现在后方模块搜索路径中的有效模块。 最简情况下,__init __.py 只是一个空文件。

换句话说,如果 __ init__.py 不存在,这个目录就仅仅是目录,而不是包,也就不能被导入或者包含其它模块和嵌套包。

5.2 执行包的初始化代码

如果你在导入 tkinter 时,打开过它的 __ init__.py,体会就更深了!

5.3 设置 __ all__ 变量

__ init__.py 在包被导入时会被执行。所以,就可以用于在其中指定默认需要导入的模块。尤其是当一个包中有很多 .py 脚本文件,那么就可以把外部可以访问的模块文件名称放在 __ all__ 变量里。推荐这一篇!


6 总结

__ init__.py 有必要存在。创建文件夹还是应该有这个文件,尽管可能不知道应该怎么用。

科普知事网