0

変数のスコープについて初心者向けの Python の質問があります。

2 つのスクリプトを作成しました。一方は他方に含まれます:

file1.py

a = 10
from file2 import *

file2.py

print a

file1.py を実行しようとすると、次のエラーが発生します: NameError: name 'a' is not defined

これが私の質問です。含まれているスクリプトでスクリプトの変数を使用できるようにすることは可能ですか?

更新: 私が実際にやろうとしているのは、次のようなものです: main.py

from config include *
from utils include *

config.py には

filename = "/tmp/file.txt"

utils.py には

def write_file():

問題は、ファイル名が必要な小さな関数がたくさんあることです。現在、utils.py にはこれらの関数がありません。私はそれらをmain.pyに持っています。しかし、時間の経過とともに main.py が大きくなるにつれて、ユーティリティ関数をメイン スクリプトから移動する簡単な方法がないかどうかを考えています。

4

2 に答える 2

1

2 番目のファイルのprint aは、最初のファイルではなく、そのスコープで実行されます。Python モジュールは、コードがファイルに「埋め込まれていない」という点で、C ヘッダー ファイルとは異なります。モジュールが読み込まれ、コードが実行されるため、そのモジュールから名前にアクセスできます。

if __name__ == '__main__':モジュールで一般的に見られるブロックは、これを示す良い例です。このコードが実際にスクリプトに埋め込まれている場合、ブロック内のコード__name__は常に実行されます'__main__'。しかし、すべてのコードはインポートされたモジュールのスコープ内で実行さ__name__れるため、異なる値になるため、コードは最上位スクリプトにある場合にのみ実行されます。

print a正常に実行できるようにするにfrom file1 import aは、2 番目のファイルで行う必要があります。

アップデートに対処すれば、これは問題になりません。from config import filenameスクリプト内で、変数が参照utilsされる前にインポートされている限り、変数を使用できfilenameます。

于 2013-02-12T08:56:21.347 に答える
0

あなたのアップデートから、あなたがconfig.py. 問題を解決する最善の方法は、ファイル名をパラメーターとしてutils.pyメソッドに送信することです。

def write_file(filename)

は、より便利なユーティリティ関数です。

def write_file()

それはスコープ内にある変数に依存しますfilename! IMHO それはまた、優れたプログラミング手法でもあります (暗黙的よりも明示的を好みますか?)。

于 2013-02-12T09:32:01.243 に答える