有和没有主要范围的导入

Import with and without main scope

我在同一目录中有两个文件,app.pydatabase.py。 我主要有以下代码片段:

app.py

import database
db = "demo_database"
print(database.show_database_information())

database.py

from app import db
database_username = "root"
database_password = "password"
def show_database_information():
    information = {}
    information["filename"] = db
    information["username"] = database_username
    information["password"] = database_password
    return information

当我尝试 运行 app.py 时出现以下错误:

Traceback (most recent call last):
  File "K:\PyPrac\circular_call\app.py", line 1, in <module>
    import database
  File "K:\PyPrac\circular_call\database.py", line 1, in <module>
    from app import db
  File "K:\PyPrac\circular_call\app.py", line 3, in <module>
    print(database.show_database_information())
AttributeError: module 'database' has no attribute 'show_database_information'

然后我更新了 app.py 并包含了 __main__ 检查如下:

app.py

import database
db = "demo_database"
if __name__ == '__main__':
    print(database.show_database_information())

现在 运行 很顺利,没有任何错误。

我有几个问题,

  1. 第一种情况发生的错误名称是什么?需要解释。
  2. 为什么在包含 __main__ 范围后 运行s?
  3. 进行这样的操作的更好方法是什么?

我能理解的如下。也许更专业的人可以详细说明!

  1. 导入错误。
  2. if __name__ == '__main__': 此条件用于检查 python 模块是直接 运行 还是导入。
  3. 如果导入了模块,那么 __name__ 是模块的名称而不是 main。因此,在这种情况下,最好调用 if __name__ == '__main__':

伙计!!你正在创造一个循环时刻。让我告诉你如何。

import database  # from app.py

但是从 database.py 开始,您从应用程序导入了数据库。那就是创造一个循环时刻。

另一方面,

if __name__ == '__main__':  

这使您 database.py 作为模块的名称而不是 __main__ 这就是它起作用的原因。没什么神奇的:)

更新:将from app import db这一行放在函数show_database_information()中 这是为您准备的热修复程序。