2017-08-23 11 views
0

同じディレクトリにapp.pydatabase.pyという2つのファイルがあります。 主に私持って、次のコードスニペット:メインスコープの有無にかかわらずインポート

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__チェックを含める:

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

app.pyは、今ではエラーなしでスムーズに動作します。私はいくつかの質問を持っている

、エラーの名前が最初のシナリオで発生している何

  1. ?説明が必要です。
  2. __main__スコープを指定して実行するのはなぜですか?
  3. このような操作を実行する方がよいでしょうか?

答えて

1

男!あなたは循環の瞬間を作り出しています。方法を教えてみましょう。

しかし、database.pyから、アプリケーションからdbをインポートしました。それは循環的な瞬間を作り出しています。一方

if __name__ == '__main__': 

これは、それが働いている理由ですモジュールの代わりに、__main__の名前としてあなたdatabase.pyなっています。何も不思議な:)

UPDATE:機能の内部に配置されfrom app import dbこのラインshow_database_information() これはあなたのための修正プログラムです。

+0

「 '' circular import'''を作成していますが、メインスコープを使ってどのように解決されていますか? – arsho

+0

@arsho私は自分の答えを更新しました。それがあなたを助けることを願っています。 –

+0

これはホットフィックスですが、今度は関数が2回呼び出されます。{'ファイル名': 'database.sqlite'、 'ユーザー名': 'ルート'、 'パスワード': 'パスワード': 'パスワード' 'password': 'password'} '' 'アップデートをありがとう。 – arsho

2

私は以下のように理解できます。たぶん誰かがもっと精通しているかもしれない!

  1. インポートエラーです。
  2. if __name__ == '__main__':この条件は、Pythonモジュールが直接実行されているか、またはインポートされているかどうかを確認するために使用されます。
  3. モジュールをインポートする場合は、__name__はmainではなくモジュールの名前です。だから、このような状況では電話するほうが良いですif __name__ == '__main__':
関連する問題