0、声明,本篇只讨论空__init__.py文件的情况,不顾前提非得说__init__.py文件里面也可以写东西的不在此讨论了范围之内,重点是个"空"字。

1、很多地方的文件夹都有__init__.py。网上一般都说,有了这个东西会把它当作一个包,否则import这个文件夹会出错。

但这就好像和说python文件中如果有中文就要在开头写 # coding =utf8这句话一样,说话囫囵吞枣不带语境,导致误会新手。

2、实际上空的__init__.py文件在python3.3以上没有卵的必要。

如果用python3.3以上在__init__.py中写了内容,那要这个文件还差不多,否则来个空的__init__.py基本上是多此一举。就和在python3里面写# coding =utf8多此一举一样。

3、现在假设有这么一个目录,里面有:

一个名叫pac的文件夹(里面没有__init__.py文件)

一个pac.py的文件

一个run.py文件

在run.py里面写上 import pac,

3.1如果是python2,import pac实际上导入 的是pac.py,如果删除了pac.py那么就会报错,因为不能能import 一个文件夹,python2只能导入pac.py或者pac文件夹里面有__init__.py这种情况,类似的你写pac.txt  pac.ppt,写个import pac也是不能导入的,不认他。

3.2如果是python3,那么import pac情况不一样,import  pac到底导入的是个啥?

需要分很多种情况,一种是pac文件夹里面有__init__.py,一种是没有__init__.py,一种是连pac文件夹都没有,一种是你当前同级目录下还有一个叫pac.py的文件,一种是没这个pac.py的文件,这一下子就多了五种情况了。

3.2.1当写import pac时候,优先查找有没有pac文件夹里面有__init__.py的这个文件夹,如果找到了,那么此时的pac代表的是有__init__.py的pac文件夹(包)。

3.3.2如果3.2.1步骤没找到,那么再去查找有没有一个叫pac.py的文件,找到了那么 pac就代表pac.py了。

3.2.3如果连pac.py都没找到,就去找一个文件夹,这个文件夹不包含__init__.py,如果找到了这个文件夹,那么就会自动把这个文件夹当作包。

3.2.4如果执行3.2.3也没找到pac,那么就会报错了,ImportError: No module named pac

4.、总结一下,python2和python3的查找顺序差不多,但是python2少了3.2.3这一步,即在python2里面如果只有pac文件夹,你就import pac那就会报错。

有__init__.py的包,叫做Regular packages ,常规包,python2只支持这个。

没有__init__.py的包,叫做Namespace package,命名空间包,python3.3以上支持这种。

Namespace package这个东西是在pep420里面新增的。

https://docs.python.org/3/whatsnew/3.3.html#pep-420-implicit-namespace-packages

https://www.python.org/dev/peps/pep-0420/

5、为了兼容python2和3,那就有必要写__init__.py;如果从不用python2,也不知道__init__.py里面然来可以写东西,只知道他是代表一个文件夹是一个包这一个作用的人,那就不需要有这个文件。

关于python 的空的__init__.py文件的作用,可不可以删除,到底有没有用?的更多相关文章

  1. Python学习笔记之__init__.py文件的作用

    参考地址:http://www.cnblogs.com/Lands-ljk/p/5880483.html Python __init__.py 作用详解 __init__.py 文件的作用是将文件夹变 ...

  2. Python模块包中__init__.py文件的作用

    转载自:http://hi.baidu.com/tjuer/item/ba37ac4ce7482a0f6dc2f08b 模块包: 包通常总是一个目录,目录下为首的一个文件便是 __init__.py. ...

  3. Python包中 __init__.py文件的作用

    原创连接 https://www.cnblogs.com/AlwinXu/p/5598543.html Python包中 __init__.py文件的作用 在创建python包的过程中,IDE都会在包 ...

  4. Python自定义Module中__init__.py文件介绍

    ./pyModuleTest/├── addutil│   ├── add.py│   ├── add.pyc│   ├── __init__.py│   ├── __init__.pyc│   └─ ...

  5. Python模块包(pycharm右键创建文件夹和python package的区别)中__init__.py文件的作用

    在eclipse中用pydev开发Python脚本时,我遇到了一个这样的现象,当我新建一个pydev package时,总会自动地生成一个空的__init__.py文件,因为是python新手,所以很 ...

  6. python 项目中包中__init__.py文件的作用

    开发python项目时,我遇到了一个这样的现象,当我新建一个pythonpackage时,总会自动地生成一个空的__init__.py文件,因为是python新手,所以很不了解这个空文件的作用是什么, ...

  7. 转载:【学习之家】Python中__init__.py文件的作用

    Python中__init__.py文件的作用详解 Python中__init__.py文件的作用详解 来源:学习之家 作者:xuexi110 人气:357 发布时间:2016-09-29 摘要:__ ...

  8. python中__init__.py文件的作用

    问题 在执行models.py时,报ImportError:No module named transwarp.db的错误,但明明transwarp下就有db.py文件,路径也没有错误.真是想不通.后 ...

  9. Python中__init__.py文件的作用详解

    转自http://www.jb51.net/article/92863.htm Python中__init__.py文件的作用详解 http://www.jb51.net/article/86580. ...

随机推荐

  1. cgi与fastcgi区别_转

    转自:https://www.cnblogs.com/wanghetao/p/3934350.html 当我们在谈到cgi的时候,我们在讨论什么 最早的Web服务器简单地响应浏览器发来的HTTP请求, ...

  2. RavenDb学习(三)静态索引

    在静态索引这块,RavenDb其实的是lucene,所以里面有很多概念,其实都是lucene本身的. .定义静态Indexes documentStore.DatabaseCommands.PutIn ...

  3. Distribute Cached 使用

    在Kettle中说到Pentaho的MapReduce要用到它,就查了一下关于它的资料,以下是从官方查到的内容,记录一下. DistributedCache: 一些比较小的需要共享的文件或者jar包, ...

  4. jQuery(三):样式操作

    一.DOM操作分类 DOM Core:任何一种支持DOM的编程语言都可以使用它,例如:getElementById(). HTML-DOM:用于处理HTML文档,例如:document.forms. ...

  5. Thymeleaf select 数据回显 选中

    <select style='width: 148.15px' name="dlrlx" th:field="*{Ygdly.dlrlx}"> &l ...

  6. Navi.Soft31.WinForm框架(含下载地址)

    1概述 1.1应用场景 尽管互联网高速发展,互联网软件也随之越来越多,但桌面应用程序在某些领域中还是不可替代,如MIS,ERP,CRM等软件产品,同时,这类软件均包括一些通用的功能,如:与数据库操作, ...

  7. Html5學習重點清單

    SVG webSQL 數據庫 SSE 服務推送 MathML 基於xml語法 Web 存储 webSockets通信 canvas 畫布操作 音頻和視頻 地理位置 Geolocation API We ...

  8. C++ vector清空元素的三种方法

    #include <iostream> #include <vector> using namespace std; //STL vector的几种清空容器(删除)办法 voi ...

  9. 关于Unity中的NGUI精灵

    NGUI精灵实例 1.创建Unity项目工程和文件目录,保存场景 2.创建一个精灵NGUI---->Create---->Sprite,发现它的UI Sprite组件的贴图属性只支持Atl ...

  10. 关于Unity中的旋涡特效的制作(捕鱼达人3技术)(专题八)

    Mesh--材质--Shader 1: Mesh 是网格,包括顶点,法线,纹理坐标,切线,三角形.在每一个3D模型节点里面,有一个Mesh Filter组件来提取模型里面的网格数据;2: Shader ...