带和不带主scop导入

2024-06-17 15:10:35 发布

您现在位置:Python中文网/ 问答频道 /正文

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

应用程序类型

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

数据库.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__检查,如下所示:

应用程序类型

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

现在它运行平稳,没有任何错误。你知道吗

我有几个问题

  1. 第一个场景中发生的错误的名称是什么?我需要解释一下。你知道吗
  2. 为什么它在包含__main__作用域之后运行?你知道吗
  3. 做这样的操作最好的方法是什么?你知道吗

Tags: pyimportappdbinformationshow错误username
2条回答

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

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

伙计!!你正在创造一个循环的时刻。让我告诉你怎么做。你知道吗

import database  # from app.py

但是从database.py你从app导入了db。这就产生了一个循环力矩。你知道吗

另一方面

if __name__ == '__main__':  

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

更新:将from app import db这一行放入函数show_database_information() 这是你的热修复程序。你知道吗

相关问题 更多 >