Python同名包和模块如何处理

问题

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

你可能感兴趣的:(python,package,module,import)