AttributeError:部分初始化的模块没有属性

AttributeError: 部分初始化的模块没有属性

AttributeError: partially initialized module has no attribute

Python“AttributeError:部分初始化的模块没有属性”的发生有两个主要原因:

  1. 文件之间存在循环依赖关系,例如文件A导入文件B
    ,反之亦然。
  2. 具有与导入模块同名的本地模块,例如
    requests.py.

部分初始化的模块没有属性

将本地模块命名为与导入模块同名

以下示例说明了错误如何在名为 的文件中发生requests.py

请求.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.pyordatetime.py并删除 import 语句中的任何循环依赖项。

开始调试的一个好方法是print(dir(your_module))查看导入的模块具有哪些属性。

主要.py
import requests # ['__builtins__', '__cached__', '__doc__', '__file__', # '__loader__', '__name__', '__package__', '__spec__', 'requests'] print(dir(requests))

如果我们查看导入requests模块的属性,我们看不到官方requests模块提供的任何实际方法。

这是一个明确的迹象,表明我们正在使用本地模块来隐藏第三方模块。

当您为模块指定与标准库模块相同的名称时,例如datetime.

sys如果您想知道本地模块是否与内置模块发生冲突,您可以使用该模块来打印所有内置模块名称。

主要.py
import sys # 👇️ print all built-in module names print(sys.builtin_module_names)

如果您要导入的模块之一导入的模块与项目中的本地文件同名,也会导致该错误。

例如,如果您导入requestsrequests 导入datetime,但您有一个名为 的本地文件,您仍然会收到错误。 datetime.py

在文件之间进行循环导入

错误的另一个常见原因是文件之间存在循环导入。

让我们看一个使用模块first_module.py和 的
示例
second_module.py

这是代码first_module.py

第一个模块.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

第二个模块.py
# 👇️ imports first_module import first_module def second_function(): print('second function') first_module.first_function()

请注意,这两个模块相互导入。这称为循环依赖。

解决两个模块相互依赖的一种方法是将 import 语句嵌套在函数作用域中。

这是更新后的second_module.py文件。

第二个模块.py
def second_function(): print('second function') # 👇️ now importing in a function scope import first_module first_module.first_function()
现在我们不在两个模块的最外层范围内导入,导入的顺序不会导致解释器出错。

创建第三个文件来处理循环导入

然而,更好的方法是创建一个third_module.py导入first_modulesecond_module使用它们的文件。

这是更新后的代码first_module.py

第一个模块.py
def first_function(): print('first function')

这是更新后的代码second_module.py

第二个模块.py
def second_function(): print('second function')

third_module.py这是使用前面两个模块的代码。

第三模块.py
import first_module import second_module first_module.first_function() second_module.second_function()

现在我们没有任何循环导入(在相同模块之间导入成员),这使得我们的代码更容易推理。

如果您有两个相互导入的模块,那么最好创建第三个模块来导入前两个模块。

如果所有建议都没有帮助,请使用该dir()函数打印导入模块具有的所有属性。

请求.py
import requests # 👇️ ['__builtins__', '__cached__', '__doc__', '__file__', # '__loader__', '__name__', '__package__', '__spec__', 'requests'] print(dir(requests))

如果将模块对象传递给
dir()函数,它将返回模块属性名称的列表。

如果您尝试访问不在此列表中的任何属性,您将收到错误消息。

这意味着您要么尝试访问模块上不存在的属性,要么您的导入语句不正确。

结论

requests.py要解决Python“AttributeError:部分初始化的模块没有属性”的问题,请确保您没有使用远程模块的名称(例如or )命名本地模块,并删除datetime.pyimport 语句中的任何循环依赖项。