问题
不久前运行项目时遇到了一个问题,这里抽象出来研究一下。对于操作系统来说一个文件夹下可以同时存在一个名为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)