gpt4 book ai didi

python - 无法从 Python 中的部分初始化模块 'mydb' 导入名称 'connection'

转载 作者:行者123 更新时间:2023-12-04 11:03:10 25 4
gpt4 key购买 nike

Python 3.8 错误

ImportError: cannot import name 'mydb' from partially initialized module 'connection' 
(most likely due to a circular import) (C:\U
sers\Mark04\Documents\Python tutorial\databasing\connection.py)
当我尝试执行子模块 select.py
import bcrypt;
from connection import mydb
那有一个导入的模块connection.py
import mysql.connector
mydb = "Success";
我不知道是什么问题。当我从模块 connection.py 中删除 import mysql.connector 时没有出现该错误,但它并没有解决我的问题。
> python -m select

最佳答案

要回答上述问题,我们需要了解循环依赖的问题。

为了理解循环依赖,我想在你面前布置一个简单的例子。

我认为每个应用程序都需要具有以下几个基本 block :

+----------------+-------------------------------------------------------------------------------------------+
| Filename | Description |
+----------------+-------------------------------------------------------------------------------------------+
| app.py | Creates the app and starts the server. |
| models.py | Define what the entity will look like (e.g, UserModel has username, email, password etc.) |
| controllers.py | Fetches Data from database, generates HTML and sends the response to the user browser. |
+----------------+-------------------------------------------------------------------------------------------+

我们的简单示例也将包含三个文件
project/
- app.py ( Creates and starts the server)
- models.py ( Class to model a user)
- controllers.py ( We will fetch data from database, and return html to user.)

app.py 文件的内容如下所示:

# =============
# app.py
# =============

# Define the application
app = Flask()

# Define the Database
db = SQLAlchemy(app)

# Register the Controller
from .controllers import auth_controller
app.register_blueprint(auth_controller)

models.py 文件的内容如下所示:

# =============
# models.py
# =============

from .app import db

# We will not focus on implementation
class User(db.Model):
pass


controllers.py 文件的内容如下所示:

# =============
# controllers.py
# =============
from flask import Blueprint
from .models import User


# Create the auth app
auth = Blueprint('auth', __name__)

# Define the Rotues
@auth.route('/login')
def login():
return "I will fetch some data and allow the user to login"


我想现在,我已经列出了我们的应用程序的图表,现在让我们继续了解应用程序将如何工作。
  • 该应用程序从 app.py 开始
  • app app.py 中的变量文件在内存中创建。
  • db app.py 中的变量在内存中创建。
  • 现在,导入 auth来自 controllers.py文件我们切换到 ```controllers.py`` 文件
  • 我们进口 Blueprint从 flask 。
  • 导入 User , 我们切换到 models.py文件。
  • 现在,在 models.py 里面我们导入的文件 db (我们可以导入它,因为它是在步骤 3 中创建的)
  • 程序继续等等....

  • 上述序列中最重要的导入步骤是 step 7 ,因为它会在我们的应用程序中引起循环依赖的问题,只是一会儿。

    现在我们将尝试更改 app.py文件来介绍循环依赖的问题。

    现在,作为开发人员,我们可能认为我们所有的导入都应该在文件的顶部,这不是让你的代码更干净吗?是的当然!它确实使代码更干净。

    # ============================
    # Refactored app.py file
    # ============================
    from .controllers import auth_controller

    # ......
    # Rest of the file is same, we only shifted this import at the top

    现在,我们的应用程序中存在循环依赖问题。让我来告诉你怎么做?
  • 我们的应用程序从 app.py 开始文件
  • 首先,我们需要导入 auth_controller来自 controllers.py文件
  • 让我们访问controllers.py文件,并进行处理。
  • 我们从 flask 中导入蓝图
  • 让我们切换到 models.py要导入的文件User
  • 内部 models.py文件,我们导入 db来自 app (但 db 还不存在。)

  • 现在,我想你明白了,如果刚刚看到的问题是循环依赖的一个例子。同样的问题导致 ImportError在你的情况下。

    解决方案是检查 import statements并将它们放在正确的位置。有时,我们使用代码格式化程序,它会重构顶部的所有导入语句。这可能会给您带来问题。

    我希望这可以回答你的问题!

    关于python - 无法从 Python 中的部分初始化模块 'mydb' 导入名称 'connection',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59156895/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com