2017-08-23 82 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__':