2017-08-23 46 views
0

我有两个文件,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__范围后运行?
  3. 做这种操作的更好方法是什么?

回答

1

男人!!你正在创造一个圆形的时刻。让我告诉如何。

import database # from app.py 

但从database.py您从应用程序导入数据库。这是创造一个循环的时刻。

在另一方面,

if __name__ == '__main__': 

这是让你database.py的模块,而不是__main__这就是为什么它的工作的一个名字。什么神奇:)

UPDATE:放置from app import db这一行的功能show_database_information() 这是给你的修补程序里面。

+0

我知道它正在创建循环导入,但是它如何使用主范围来解决? – arsho

+0

@arsho我已经更新了我的答案。我希望它能帮助你。 –

+0

它是一个热修复,但现在函数被调用两次。 '''{'filename':'database.sqlite','username':'root','password':'password'} {'filename':'database.sqlite','username':'root', '密码':'密码'}'''感谢您的更新。 – arsho

2

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

  1. 导入错误。
  2. if __name__ == '__main__':此条件用于检查python模块是直接运行还是正在导入。
  3. 如果一个模块被导入,那么它的__name__是模块的名称而不是main。所以,在这种情况下最好打电话if __name__ == '__main__':