Pon*_*dle 4 python import import-hooks
几个小时后,我发现了应用程序中的错误原因.我的应用程序的源代码结构如下:
main/
__init__.py
folderA/
__init__.py
fileA.py
fileB.py
Run Code Online (Sandbox Code Playgroud)
真的,还有大约50个文件.但那不是重点.在main/__init__.py,我有这个代码:from folderA.fileA import *
在folderA/__init__.py我有这个代码:
sys.path.append(pathToFolderA)
Run Code Online (Sandbox Code Playgroud)
在folderA/fileB.py我有这个代码:
from fileA import *
Run Code Online (Sandbox Code Playgroud)
问题是fileA被导入两次.但是,我只想导入一次.
解决这个问题(我ATLEAST)最显而易见的方法是改变从某些路径path到folderA.path
但我觉得Python首先应该没有这个错误.还有哪些其他解决方法不需要每个文件知道它的绝对位置?
小智 5
不要以这种方式修改sys.path,因为它提供了两种方式(名称)来访问您的模块,从而导致您的问题.
改为使用绝对或明确相对的导入.(模糊相对导入可以作为旧版Python版本的最后手段.)
from main.folderA.fileA import * # absolute
from .fileA import * # unambiguous-relative
from fileA import * # ambiguous-relative
Run Code Online (Sandbox Code Playgroud)
当然,您应该使用特定的名称代替那颗星.
修改sys.path不是你在真实程序中做的事情.它会损害模块性和可移植性,而不会永久地设置PYTHONPATH或将模块放在Python可以找到的位置.
从来没有使用过import *.它会污染您的命名空间并使您的代码无法预测.
你不想要folderA sys.path.它是一个子包,main应该始终如此对待.始终使用绝对导入到顶级包:import main.folderA而不是import folderA或其他任何东西; 它将使您的代码更容易遵循和移动和安装.