AttributeError: 部分初始化的模块没有属性
AttributeError: partially initialized module has no attribute
Python“AttributeError:部分初始化的模块没有属性”的发生有两个主要原因:
- 文件之间存在循环依赖关系,例如文件
A
导入文件B
,反之亦然。 - 具有与导入模块同名的本地模块,例如
requests.py
.
将本地模块命名为与导入模块同名
以下示例说明了错误如何在名为 的文件中发生requests.py
。
import requests def make_request(): # ⛔️ AttributeError: partially initialized module 'requests' # has no attribute 'get' (most likely due to a circular import) res = requests.get('https://reqres.in/api/users') parsed = res.json() print(parsed) make_request()
请注意,我正在将requests
第三方模块导入名为 的本地文件中requests.py
。
将本地文件命名为与我要导入的模块相同的名称会导致循环导入。
Python解释器
首先
在内置模块中查找导入的模块,然后在当前目录中查找,然后在PYTHON PATH中查找,然后在依赖于安装的默认目录中查找。
确保您没有使用删除模块的名称来命名本地模块
确保您没有使用远程模块的名称来命名本地模块,例如requests.py
ordatetime.py
并删除 import 语句中的任何循环依赖项。
开始调试的一个好方法是print(dir(your_module))
查看导入的模块具有哪些属性。
import requests # ['__builtins__', '__cached__', '__doc__', '__file__', # '__loader__', '__name__', '__package__', '__spec__', 'requests'] print(dir(requests))
如果我们查看导入requests
模块的属性,我们看不到官方requests
模块提供的任何实际方法。
这是一个明确的迹象,表明我们正在使用本地模块来隐藏第三方模块。
当您为模块指定与标准库模块相同的名称时,例如datetime
.
sys
如果您想知道本地模块是否与内置模块发生冲突,您可以使用该模块来打印所有内置模块名称。
import sys # 👇️ print all built-in module names print(sys.builtin_module_names)
如果您要导入的模块之一导入的模块与项目中的本地文件同名,也会导致该错误。
requests
并requests
导入datetime
,但您有一个名为 的本地文件,您仍然会收到错误。 datetime.py
在文件之间进行循环导入
错误的另一个常见原因是文件之间存在循环导入。
让我们看一个使用模块first_module.py
和 的
示例second_module.py
。
这是代码first_module.py
:
# 👇️ imports second_module import second_module def first_function(): print('first function') # ⛔️ AttributeError: partially initialized module 'second_module' # has no attribute 'second_function' (most likely due to a circular import) second_module.second_function()
这是代码second_module.py
:
# 👇️ imports first_module import first_module def second_function(): print('second function') first_module.first_function()
请注意,这两个模块相互导入。这称为循环依赖。
这是更新后的second_module.py
文件。
def second_function(): print('second function') # 👇️ now importing in a function scope import first_module first_module.first_function()
创建第三个文件来处理循环导入
然而,更好的方法是创建一个third_module.py
导入first_module
和second_module
使用它们的文件。
这是更新后的代码first_module.py
。
def first_function(): print('first function')
这是更新后的代码second_module.py
。
def second_function(): print('second function')
third_module.py
这是使用前面两个模块的代码。
import first_module import second_module first_module.first_function() second_module.second_function()
现在我们没有任何循环导入(在相同模块之间导入成员),这使得我们的代码更容易推理。
如果所有建议都没有帮助,请使用该dir()
函数打印导入模块具有的所有属性。
import requests # 👇️ ['__builtins__', '__cached__', '__doc__', '__file__', # '__loader__', '__name__', '__package__', '__spec__', 'requests'] print(dir(requests))
如果将模块对象传递给
dir()函数,它将返回模块属性名称的列表。
如果您尝试访问不在此列表中的任何属性,您将收到错误消息。
这意味着您要么尝试访问模块上不存在的属性,要么您的导入语句不正确。
结论
requests.py
要解决Python“AttributeError:部分初始化的模块没有属性”的问题,请确保您没有使用远程模块的名称(例如or )命名本地模块,并删除datetime.py
import 语句中的任何循环依赖项。