Python同名包和模块如何处理

文章通过实验展示了Python中导入同名包和模块时的优先级规则:内置模块>自定义包>自定义模块>三方安装包。在实验一中,导入了同名的test包和test.py模块,结果显示导入的是包。实验二显示,即使有自定义的math包和math.py,Python仍然优先导入内置的math模块。实验三探讨了三方模块与自定义模块或包的情况。
摘要由CSDN通过智能技术生成

问题

不久前运行项目时遇到了一个问题,这里抽象出来研究一下。对于操作系统来说一个文件夹下可以同时存在一个名为test的文件夹和一个名为test.txt的文件,但是对于python而言,如果在项目的某一个文件夹下同时存在一个名为test的包和一个名为test.py的模块,显然在导包时会存在一个问题,根据python导包语法,两者导包方式一摸一样,那么会导入哪一个还是说会报错呢?而且更进一步,假设本身就有一个内置的模块,此时我定义同名模块和包,会如何?

我直接放答案

优先级为:内置模块 > 自定义包 > 自定义模块 > 三方安装包

实验一,自定义test包和test.py模块

test/__init__.py

TEST_STR = "test-package"

test.py

TEST_STR = "test-module"

main.py

from test import TEST_STR
print(f"test: {TEST_STR}")

结果为:

test: test-package

显然,导的是包

实验二,自定义math包和math.py模块

内置模块中有同名math的,其中有函数sqrt用以进行开方运算
math/__init__.py

def sqrt(i):
    return f"math-package {i}"

math.py

def sqrt(i):
    return f"math-module {i}"

main.py

from math import sqrt
print(f"math: {sqrt(64)}")

结果为:

math: 8.0

显然,导的是内置模块

实验三,三方模块与自定义模块或包

就用Flask做为测试,先安装flask

pip install Flask

新建一个demo项目,新建一个空flask.py或者空flask包,然后将如下代码写入main.py文件,main.py位于根目录下,此时可以引用到flask,不妨运行main.py看看打印的模块路径

import flask
print(flask)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值