python的模块,包和目录的区别和自定义包的注意点

简介: 先插入模块/包是怎么找的先找当前的包找有没有,没有去安装目录的内置函数中,再没有看看你设置的系统环境变量有没有一般情况,代码添加的环境变量只存在当前窗口,关闭就没了-

先插入模块/包是怎么找的

先找当前的包找有没有,没有去安装目录的内置函数中,再没有看看你设置的系统环境变量有没有

一般情况,代码添加的环境变量只存在当前窗口,关闭就没了-

正题

  1. python中模块是包含变量、函数等的文件;只要是你想引用的文件都叫模块
  2. 包是存放多个文件/模块的文件夹,可以 统一组织和管理 多个python模块
  3. 包结构中包含一个特殊的文件[__init__.py]。

两者的区别:包是一个文件夹,可以存放多个文件/模块,

模块是一个文件。

模块可以放在包,也可以放在目录,而放在包的作用是(见上见下)


在引入Package中的模块时from xx import xx和import xx,而使用后者时还要确保__init__.py文件中个导入了模块

在引入Directory中内容时,只可以引入该目录的子目录中的内容,也可以在目录中添加__init__.py使之可以像包一样引用


而使用import xx(特别注意,这里的xx是包名!)时还要确保__init__.py文件中个导入了模块

这个再详细说明

做为包,你可以选择import和from 前者引用全部,后者可以选择包中的子模块,而当引用全部却没有在__init__.py写子模块的位置就会报错,例如:

import pay #引用pay这个包
pay.alipay.tools.pay2()# 再使用pay包当前目录的alipay文件夹里的tools.py里的pay2方法

会报错

module 'pay' has no attribute 'alipay'

报错是因为导入包,实际是导入包的__init__.py

那为什么 from pay.alipay.tools import pay2 可以??

A:因为这种方式已经明确了路径了啊,或者见下面对于单文件和目录的说法吧~

直接import pay 对的就是pay下的__init__.py 这个很关键,而当你使用包里的子模块或者方法的时候必须在__init__.py写明位置,不然读取不了

如何修复?

一般下__init__.py都是空的,要去写

pay下的__init__.py 加 from . import alipay

同样在alipay文件下的__init__.py 填from .tools import pay2, get_status //注意这里import 可以逗号形式写

. 是什么呢?可以说.就是当前目录,也就是前面我非要在前面别扭地打出当前目录

说到这里,可能又发现-

那为什么 from pay.alipay.tools import pay 这个pay前面没有. 因为这种直接明确地址的是在项目的根目录开始找起,不需要添加,添加反而出错

这里要区分开,就是在 __init__.py引用要加当前目录

from . import alipay 意思是 pay下作为当前目录,找pay里的alipay

好,说到这里你可以有点糊涂了,没事,先冷静下

引用单个文件的时候,写的import就得麻烦了

1.from的写法

假设a文件夹里的b文件夹有c.py 我们引用的时候得这样写

from a.b import c 这意思是占用的父文件夹a当前目录(.)下的b,b文件夹的c.py

2.import c,至于怎么找,看最上面的插入吧

这里要跟包区分,因为包的import是文件夹的/包的名称,而这里就是c.py,因此直接指向c.py,而包名指向__init__.py

包可以选择两种方法,from更能选择包里的子包。

这里继续说到上面的遗留问题

from pay.alipay.tools import pay2

对于上面来说,没有加.是因为从根目录上找,pay却是a文件夹的,那为什么这里又把a.b写上,而不写b呢,

1.这是单个文件,或者说是目录的文件,不是包

2.在引入Directory中内容时,只可以引入该目录的子目录中的内容,在上面谈到了。因为如果直接写b,它会认为是一个包,但是却没有__init__.py,所以说这里得b弄成子目录,否则不能引用b文件夹的c.py,也就说引用模块,from必须的是子目录

,写出子目录,即使是包,也得指向from pay.tools pay的tools.py 没有直接指向pay。或者说只写一个,先认为你是一个模块,而不是目录。也就是最后一个tool和第一个必须是模块,而不是目录……

只写一个目录,还不如直接当包直接import

其实,还有个最最不会出错的方法就是……

写好包,先不引用,写好部分代码,让pycharm给你自动修复引用@(真棒)


目录
相关文章
|
7天前
|
Python
Python Internet 模块
Python Internet 模块。
102 74
|
25天前
|
算法 数据安全/隐私保护 开发者
马特赛特旋转算法:Python的随机模块背后的力量
马特赛特旋转算法是Python `random`模块的核心,由松本真和西村拓士于1997年提出。它基于线性反馈移位寄存器,具有超长周期和高维均匀性,适用于模拟、密码学等领域。Python中通过设置种子值初始化状态数组,经状态更新和输出提取生成随机数,代码简单高效。
104 63
|
24天前
|
存储 开发者 Python
Python 中的数据结构与其他编程语言数据结构的区别
不同编程语言都有其设计理念和应用场景,开发者需要根据具体需求和语言特点来选择合适的数据结构
|
27天前
|
持续交付 Python
如何在Python中自动解决模块和包的依赖冲突?
完全自动解决所有依赖冲突可能并不总是可行,特别是在复杂的项目中。有时候仍然需要人工干预和判断。自动解决的方法主要是提供辅助和便捷,但不能完全替代人工的分析和决策😉。
|
7月前
|
Python 人工智能 数据可视化
Python模块与包(八)
Python模块与包(八)
58 0
Python模块与包(八)
|
28天前
|
开发者 Python
如何在Python中管理模块和包的依赖关系?
在实际开发中,通常会结合多种方法来管理模块和包的依赖关系,以确保项目的顺利进行和可维护性。同时,要及时更新和解决依赖冲突等问题,以保证代码的稳定性和可靠性
45 4
|
27天前
|
测试技术 Python
手动解决Python模块和包依赖冲突的具体步骤是什么?
需要注意的是,手动解决依赖冲突可能需要一定的时间和经验,并且需要谨慎操作,避免引入新的问题。在实际操作中,还可以结合使用其他方法,如虚拟环境等,来更好地管理和解决依赖冲突😉。
|
28天前
|
Python
Python的模块和包
总之,模块和包是 Python 编程中非常重要的概念,掌握它们可以帮助我们更好地组织和管理代码,提高开发效率和代码质量
38 5
|
27天前
|
数据可视化 Python
如何在Python中解决模块和包的依赖冲突?
解决模块和包的依赖冲突需要综合运用多种方法,并且需要团队成员的共同努力和协作。通过合理的管理和解决冲突,可以提高项目的稳定性和可扩展性
|
3月前
|
人工智能 数据可视化 搜索推荐
Python异常模块与包
Python异常模块与包

热门文章

最新文章