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. [uboot]uboot中run的一些command在源码位置

    如在uEnv.txt中, loadfdt=fatload mmc ${mmcdev}: ${fdtaddr} ${fdtfile} fdtboot=run mmc_args; bootz ${load ...

  2. Java并发编程:Lock和Synchronized <转>

    在上一篇文章中我们讲到了如何使用关键字synchronized来实现同步访问.本文我们继续来探讨这个问题,从Java 5之后,在java.util.concurrent.locks包下提供了另外一种方 ...

  3. Linux下用文件IO的方式操作GPIO(/sys/class/gpio)

    通过sysfs方式控制GPIO,先访问/sys/class/gpio目录,向export文件写入GPIO编号,使得该GPIO的操作接口从内核空间暴露到用户空间,GPIO的操作接口包括direction ...

  4. Go Revel - Interceptors(拦截器)

    `interceptor`拦截器是revel框架在执行一个`action`的前后所调用的函数.他允许以AOP方式进行开发,这种模式非常有用: 1.记录请求日志 2.错误处理 3.状态保持 在revel ...

  5. 问题解决:bash: fork: retry: Resource temporarily unavailable

    linux报错: bash: fork: retry: Resource temporarily unavailable 不管是执行什么 登陆不了服务器The server refused to st ...

  6. linq操作符:分组操作符

    分组是根据一个特定的值将序列中的元素进行分组.LINQ只包含一个分组操作符:GroupBy.GroupBy操作符类似于T-SQL语言中的Group By语句.来看看GroupBy的方法定义: publ ...

  7. 快速掌握Vue.js使用【转】

    Vue.js是当下很火的一个JavaScript MVVM库,它是以数据驱动和组件化的思想构建的.相比于Angular.js,Vue.js提供了更加简洁.更易于理解的API,使得我们能够快速地上手并使 ...

  8. 一圖讓你看懂javascript原型鏈

    每個對象的原型(protype)是一個對象 每個對象都有一個內置屬性protype(__pro__)指向一個對象

  9. Android 软键盘弹出与关闭监听

    private void listenerSoftInput() { final View activityRootView = findViewById(R.id.activityRoot); ac ...

  10. Python之FLAGS用法

    from absl import app from absl import flags FLAGS = flags.FLAGS flags.DEFINE_string('gpu', None, 'co ...