在python程序编写过程中,如何解决模块名称冲突?

如题所述

如果你有两个同名的模块,那么你只能导人它们中的一个——默认情况下,Python总是会选择在模块搜索路径sys.path中最左边的那一项。如果你偏爱的模块和顶层脚本在同一目录下,那就不成问题;由于顶层脚本的主目录总是模块搜索路径中的第一项,因此它的内容总是会首先被自动定位。然而对于跨目录的导入,模块搜索路径的线性本质意味着同名的文件会产生冲突。
要修复这一冲突,要么避免同名文件。如果你需要同时访问两个同名的文件,那么就要把两个源文件分别放入子目录中,这样包导入目录名称将使得模块引用唯一。只要外围的包目录名称是唯一的,你就能访问同名模块中的任意一个,或是全部的两个。注意,如果你不小心为自己的模块使用了一个名称,而它碰巧和你需要使用的标准库模块的名称相同,那么也会出现这一问题。这是因为程序主目录(或是模块路径中靠前的另一个目录)下的本地模块会隐藏和替换标准库模块。要修复这种覆盖,要么避免使用和你需要的另一模块相同的名称,要么把模块放到一个包目录下然后使用Python 3.X的包相对导入模型(包相对导入在2.X版本中是一个可选的功能)。在包相对导入模型下,普通导入会跳过包目录,因此你可以获取标准库版本,但在必要时特殊的点号开头导入语句仍然可以选取同名模块的本地版本。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2022-02-07
如果两个包中定义的函数,类,或者子模块互相重名,那么就可能会导致名称冲突,例如:
from analysis.utils import inspect
from frontend.utils import inspect # 覆盖前一句导入的inspect
解决方法1
在import语句中,通过as语句,给引入当前作用域中的属性重新起名,例如:
from analysis.utils import inspect as analysis_inspect
from frontend.utils import inspect as frontend_inspect
凡是通过import语句引入的内容,都可以通过as子句来改名,及时引入整个模块,也依然能用as为其改名。
解决方法2
每次使用模块时都从最高层的路径来时,完整地写出各模块的名称。例如:
import analysis.utils
import frontend.utils
然后通过analysis.utils.inspect和frontend.utils.inspect这样完整的路径来访问这两个模块中的函数。
第2个回答  2022-02-07
个人觉得最好的办法就是在提前准备好各个模块的名称,而不要临时性的给模块起名