关于python 的空的__init__.py文件的作用,可不可以删除,到底有没有用?
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文件的作用,可不可以删除,到底有没有用?的更多相关文章
- Python学习笔记之__init__.py文件的作用
参考地址:http://www.cnblogs.com/Lands-ljk/p/5880483.html Python __init__.py 作用详解 __init__.py 文件的作用是将文件夹变 ...
- Python模块包中__init__.py文件的作用
转载自:http://hi.baidu.com/tjuer/item/ba37ac4ce7482a0f6dc2f08b 模块包: 包通常总是一个目录,目录下为首的一个文件便是 __init__.py. ...
- Python包中 __init__.py文件的作用
原创连接 https://www.cnblogs.com/AlwinXu/p/5598543.html Python包中 __init__.py文件的作用 在创建python包的过程中,IDE都会在包 ...
- Python自定义Module中__init__.py文件介绍
./pyModuleTest/├── addutil│ ├── add.py│ ├── add.pyc│ ├── __init__.py│ ├── __init__.pyc│ └─ ...
- Python模块包(pycharm右键创建文件夹和python package的区别)中__init__.py文件的作用
在eclipse中用pydev开发Python脚本时,我遇到了一个这样的现象,当我新建一个pydev package时,总会自动地生成一个空的__init__.py文件,因为是python新手,所以很 ...
- python 项目中包中__init__.py文件的作用
开发python项目时,我遇到了一个这样的现象,当我新建一个pythonpackage时,总会自动地生成一个空的__init__.py文件,因为是python新手,所以很不了解这个空文件的作用是什么, ...
- 转载:【学习之家】Python中__init__.py文件的作用
Python中__init__.py文件的作用详解 Python中__init__.py文件的作用详解 来源:学习之家 作者:xuexi110 人气:357 发布时间:2016-09-29 摘要:__ ...
- python中__init__.py文件的作用
问题 在执行models.py时,报ImportError:No module named transwarp.db的错误,但明明transwarp下就有db.py文件,路径也没有错误.真是想不通.后 ...
- Python中__init__.py文件的作用详解
转自http://www.jb51.net/article/92863.htm Python中__init__.py文件的作用详解 http://www.jb51.net/article/86580. ...
随机推荐
- [加密]SSL/TLS原理详解
转自: http://www.cnblogs.com/leivon/p/5691619.html https://www.cnblogs.com/leivon/p/5692588.html
- redis关闭/重启服务器
通过docker实现: 一.创建redis服务器与客户端 docker run -p : -d --name redis-server docker.io/redis: redis-server -- ...
- JBoss Wildfly (1) —— 7.2.0.Final编译
JBoss Wildfly (1) -- 7.2.0.Final编译 wildfly版本: 7.2.0.Final-testsuite-fix jdk版本: jdk1.7.0_79 maven版本: ...
- hive表增量抽取到oracle数据库的通用程序(一)
hive表增量抽取到oracle数据库的通用程序(二) sqoop在export的时候 只能通过--export-dir参数来指定hdfs的路径.而目前的需求是需要将hive中某个表中的多个分区记录一 ...
- Hbase 学习(七) rowkey设计
一直以来对rowkey的设计都比较迷茫,<hbase权威指南>倒是给出了个还算靠谱的例子. 下面这个例子有点儿像帖子表结构,它的rowkey设计是这样的,可以简单的理解为,什么人在什么时间 ...
- linux安装android sdk
https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip 1,先安装java https://developer.and ...
- Ubuntu下Eclipse中文乱码解决
把Windows下的工程导入到了Linux下Eclipse中,由于以前的工程代码,都是GBK编码的(Windows下的Eclipse 默认会去读取系统的编码,所以Widnwos下的Eclipse的编码 ...
- 实现JTextfield 的右键 复制、剪切、粘贴功能。
http://leagion.iteye.com/blog/572730 ——————————————————————————————————————————————————————————————— ...
- spring mvc中关于url中传递中文乱码的解决方法
在传值过程中,也是乱码出现的频繁地.先不说到底是什么场景了,通常常用的方案有如下几个 配置指定的filter <!-- 配置请求过滤器,编码格式设为UTF-8,避免中文乱码--> < ...
- 我写的javascript常用静态方法类,分享给大家
util=function(){ return { $:function(id){ return document.getElementById(id); ...