156

Python スクリプトでモジュールをインポートする際に、ちょっとした壁にぶつかりました。エラー、エラーが発生した理由、および問題を解決するためにこの特定のアプローチを使用している理由を説明するために最善を尽くします (これについてはすぐに説明します)。

この補助モジュールがインポートされる名前空間で定義されたエンティティを参照する、いくつかのユーティリティ関数/クラスを定義したモジュールがあるとします (「a」をそのようなエンティティとします)。

モジュール 1:

def f():
    print a

そして、これらのユーティリティをインポートしたい "a" が定義されているメイン プログラムがあります。

import module1
a=3
module1.f()

プログラムを実行すると、次のエラーが発生します。

Traceback (most recent call last):
  File "Z:\Python\main.py", line 10, in <module>
    module1.f()
  File "Z:\Python\module1.py", line 3, in f
    print a
NameError: global name 'a' is not defined

過去にも同様の質問があり(2 日前のことです)、いくつかの解決策が提案されましたが、これらが私の要件に合っているとは思えません。これが私の特定のコンテキストです:

MySQL データベース サーバーに接続し、GUI でデータを表示/変更する Python プログラムを作成しようとしています。簡潔にするために、補助/ユーティリティ MySQL 関連の関数の束を別のファイルに定義しました。ただし、それらはすべて、最初にユーティリティ モジュールで定義した共通の変数を持ち、MySQLdb モジュールのカーソルオブジェクトです。後で、カーソルオブジェクト (db サーバーとの通信に使用される) をメイン モジュールで定義する必要があることに気付きました。これにより、メイン モジュールとそこにインポートされたものの両方がそのオブジェクトにアクセスできるようになります。

最終結果は次のようになります。

utility_module.py:

def utility_1(args):
    code which references a variable named "cur"
def utility_n(args):
    etcetera

そして私のメインモジュール:

program.py:

import MySQLdb, Tkinter
db=MySQLdb.connect(#blahblah) ; cur=db.cursor()  #cur is defined!
from utilities_module import *

そして、ユーティリティ関数のいずれかを呼び出そうとするとすぐに、前述の「グローバル名が定義されていません」というエラーが発生します。

特定の提案は、次のように、ユーティリティ ファイルに "from program import cur" ステートメントを含めることでした。

utility_module.py:

from program import cur
#rest of function definitions

program.py:

import Tkinter, MySQLdb
db=MySQLdb.connect(#blahblah) ; cur=db.cursor()  #cur is defined!
from utilities_module import *

しかし、それは循環インポートかそのようなものであり、結論として、それもクラッシュします。だから私の質問は:

メインモジュールで定義された「cur」オブジェクトを、それにインポートされた補助関数から見えるようにするにはどうすればよいでしょうか?

お時間をいただきありがとうございます。解決策が他の場所に投稿されている場合は、深くお詫び申し上げます。私は自分で答えを見つけることができず、私の本にはもうトリックがありません.

4

9 に答える 9