浅谈Python中的包
浅谈Python中的包
Package的定义(你以为的)
你在很多的地方都能看到关于package的定义:在Python中在当前目录下有__init__.py文件的目录即为一个package。
嗯,包括python目前的官网文档也是类似这么介绍的
https://docs.python.org/zh-cn/3.9/tutorial/modules.html#packages Python 只把含 __init__.py 文件的目录当成包
https://docs.python.org/3.9/tutorial/modules.html#packages The __init__.py files are required to make Python treat directories containing the file as packages
3.9如此,3.11也是的,可能是文档维护人员的工资没发?
Package的定义(应该是这样的)
- 然在上面的文档中,有这样一句
- 包是一种用“点式模块名”构造 Python 模块命名空间的方法
- Packages are a way of structuring Python’s module namespace by using “dotted module names”.
我认为是比较符合当前的设定的
是否需要初始化文件
- 看上面这个文章,尾部有这样的一段说明
Much of the Python documentation states that an __init__.py file must be present in the package directory when creating a package. This was once true. It used to be that the very presence of __init__.py signified to Python that a package was being defined. The file could contain initialization code or even be empty, but it had to be present.
Starting with Python 3.3, Implicit Namespace Packages were introduced. These allow for the creation of a package without any __init__.py file. Of course, it can still be present if package initialization is needed. But it is no longer required.
- 简陋的翻译一下
很多的python文档说__init__.py必须要存在于package目录中,当你创建一个package的时候(注:事实上IDE如pycharm也是这么做的,默认就给你创建了..)。这曾经是对的。曾经它出现在一个python的目录中就表示了你在创建一个包。这个__init__.py文件可以包含初始化文件或者为空,但它必须存在。
从Python3.3开始,开始引入了隐式命名空间包的概念。这就允许了创建包的时候不需要__init__.py。当然如果一个包要初始化,它仍然是需要的。但是,不再是必要的!
PEP 420 Implicit Namespace Packages
在Specification章节
Regular packages will continue to have an __init__.py and will reside in a single directory. Namespace packages cannot contain an __init__.py
它也提到了namespace packages和regular packages的区别
- Portions of namespace packages need not all come from the same directory structure, or even from the same loader. Regular packages are self-contained: all parts live in the same directory hierarchy.
- Namespace packages have no
__file__
attribute. - Namespace packages’
__path__
attribute is a read-only iterable of strings, which is automatically updated when the parent path is modified. - Namespace packages have no
__init__.py
module. - Namespace packages have a different type of object for their
__loader__
attribute
这个区别实在不好测试,比想象的要繁琐很多
一个简单的测试
目录结构
D:\pythonProject\AutoTest\PackageTest (7.08KB) ├── NamespacePack (2b) │ ├── demoNP.py (24b) ├── RegularPack (35b) │ ├── demoRP.py (24b) │ ├── __init__.py (2b) └── testPack.py (114b)
区别就是在pycharm上创建一个目录NamespacePack,创建一个package(RegularPack)
demoNP.py
nameNP = 'NamespacePack'
demoRP.py
nameRP = 'RegularPack'
__init__.py为空
testPack.py
from NamespacePack.demoNP import nameNP
from RegularPack.demoRP import nameRP print(nameNP) # 输出NamespacePack
print(nameRP) # 输出RegularPack
跟普通的包似乎没有任何区别(至少我感知不到)
说在最后
- 初学者(我也算)无需纠结细节
- 只需知道python中的包并不一定要
__init__.py
,over
浅谈Python中的包的更多相关文章
- 浅谈python中得import xxx,from xxx import xxx, from xxx import *
在python中import跟from import都是用来导入的,但是导入的机制不同 1.import xxx:导入模块,或者文件夹,对于调用模块或者文件夹中子模块的变量或者函数,需要使用" ...
- 浅谈python中的“ ==” 与“ is”
在python中,== 与 is 之间既有区别,又有联系,本文将通过实际代码的演示,力争能够帮助读到这篇文章的朋友以最短的时间理清二者的关系,并深刻理解它们在内存中的实现机制.扯淡的话不多说,下面马上 ...
- 浅谈python中文件和文件夹的相关操作
文件操作 文件的打开与关闭 打开文件 使用open(文件名,访问方式)函数,可以打开一个已存在的文件,或者创建一个新的文件. 示例如下: f = open('test.txt') # 访问方式可以省略 ...
- 浅谈python中字典append 到list 后值的改变问题
看一个例子 ? 1 2 3 4 d={'test':1} d_test=d d_test['test']=2 print d 如果你在命令行实践的话,会发现你改动的是d_test ,但是d 也跟着改变 ...
- 浅谈python中的闭包函数
闭包函数初探 通常我们定义函数都是这样定义的 def foo(): pass 其实在函数式编程中,函数里面还可以嵌套函数,如下面这样 def foo(): print("hello worl ...
- 浅谈python中的“ ==” 与“ is”、还有cmp
总之,比较内容相等使用 ‘==’ 1.is" 是用来比较 a 和 b 是不是指向同一个内存单元,而"=="是用来比较 a 和 b指向的内存单元中的值是不是相等 2.pyt ...
- 浅谈Python中函数式编程、面向对象编程以及古怪的PythonIC
1.函数式编程作为结构化编程的一种,正在受到越来越多的重视.那么什么事函数式编程呢? 在维基百科中给出了详细的定义,函数式编程又称泛函数编程,是一种编程规范,它将函数运算视为数学上的函数计算.简单的来 ...
- 浅谈python中selenium库调动webdriver驱动浏览器的实现原理
最近学web自动化时用到selenium库,感觉很神奇,遂琢磨了一下,写了点心得. 当我们输入以下三行代码并执行时,会发现新打开了一个浏览器窗口并访问了百度首页,然而这是怎么做到的呢? from se ...
- 浅谈python中__str__和__repr__的区别
很多时候我们在创建一个类的时候,在终端打印类或者查看的时候一般都不会得到一个太满意的结果 class T: def __init__(self): self.color="red" ...
- 浅谈Python 中 __getattr__与__getattribute__的区别
__getattr__与__getattribute__均是一般实例属性截取函数(generic instance attribute interception method),其中,__getatt ...
随机推荐
- AR空间音频能力,打造沉浸式声音体验
随着元宇宙的兴起,3D虚拟现实广泛引用,让数字化信息和现实世界融合,目前大家的目光主要聚焦于视觉交互层面,为了在虚拟环境中更好的再现真实世界的三维空间体验,引入听觉层面必不可少,空间音频孕育而生. 空 ...
- golang实现一个简单的http代理
代理是网络中的一项重要的功能,其功能就是代理网络用户去取得网络信息.形象的说:它是网络信息的中转站,对于客户端来说,代理扮演的是服务器的角色,接收请求报文,返回响应报文:对于web服务器来说,代理扮演 ...
- C#字典出错“集合已经修改,可能无法执行枚举操作”
出现这个现象的原因是由于线程安全考虑,如果你边对字典循环,又同时移除字典中的某个键值对, 那么将会出现这种错误,解决这种问题的方法是你没次remove某个键值对后需要break结束对字典的循环.
- C#使用附加到进程调试
微软官网的调试进程介绍 首先运行bin下的可执行文件,然后打开源代码,选择调试--->附加到进程.
- 思维分析逻辑 2 DAY
目录 数据分析多元思维模型 微观能力 中观能力 宏观能力 电商平台分析 整体数据 漏斗模型 互联网金融分析 授信模型 了解芝麻信用分结构 数据源的数据变量 数据处理 游戏数据分析 常规指标 商业化指标 ...
- 这次,听人大教授讲讲分布式数据库的多级一致性|TDSQL 关键技术突破
近年来,凭借高可扩展.高可用等技术特性,分布式数据库正在成为金融行业数字化转型的重要支撑.分布式数据库如何在不同的金融级应用场景下,在确保数据一致性的前提下,同时保障系统的高性能和高可扩展性,是分布式 ...
- Pycharm2022.1.3安装教程(包含基础使用配置)
pycharm的下载安装及使用 以我的Pycharm2022.1.3为例 首先去官网下载professtional(专业版)版本 2022.1.3版本Pycharm软件 https://www.jet ...
- Nginx 安装篇-1.19.9版本源码安装
系统环境:CentOS 8.5 64位 [开始安装](此步骤引自网络教程) https://www.cnblogs.com/torchstar/p/16027538.html 教程比较详细,一步步操作 ...
- 这玩意也太猛了!朋友们,我在此严正呼吁大家:端好饭碗,谨防 AI!
你好呀,我是歪歪. 最近几天大火的 ChatGPT 你玩了吗? 如果你不知道它是个什么东西,那么我让它给你来个自我介绍: 说白了,就是一个可以对话的人工智能. 我开始以为就是一个升级版的"小 ...
- win10中jupyter notebook设置conda虚拟环境全流程及问题汇总
正常安装流程 1.安装anaconda 必备条件 2.安装jupyter notebook 一般anaconda自带安装 如没有,则在终端安装 conda install jupyter notebo ...