私はPythonの専門家ではないので、可変スコープのニュアンスを理解しようとしています。モジュールと変数スコープ
私が直面している問題を説明する簡単な例として、次の3つのファイルがあるとします。
最初のファイルはoutside_code.pyです。特定の制限のため、このファイルを変更することはできません。それはそのままでなければなりません。それは、ある時点で評価を実行するいくつかのコードを含んでいます(はい、私はevalが悪魔の産物であることを知っていますが、それは後日の議論です)。たとえば、次のコード行が含まれているとします。
def eval_string(x):
return eval(x)
2番目のファイルは、ユーザー定義関数のセットです。 functions.pyとしましょう。これは、関数定義のいくつかの未知の番号が含まれ、例えば、のはそのfunctions.pyが一つの機能が含まれているとしましょう、以下に定義する:
def foo(x):
print("Your number is {}!".format(x))
は、今私は3番目のファイルを書き込み、のは、それを呼びましょうmain.py.これは、次のコードが含まれます。
import outside_code
from functions import *
outside_code.eval_string("foo(4)")
私は*でfunctions.pyから関数定義のすべてをインポートするので、彼らは()functions.fooような何かをすることなく、main.pyでアクセスできる必要があります。 outside_code.pyもインポートするので、コア機能(評価版を含むコード)にアクセスできます。最後に、関数_files.pyで関数を呼び出し、functions.pyで定義された関数に関連する文字列を渡します。
簡略化した例では、「Your number is 4!」というコードを印刷します。しかし、 'foo'が定義されていないというエラーが表示されます。これは、outside_code.pyのコードがmain.pyにあるのと同じfoo関数にアクセスできないことを意味します。だから何とか私はfooにアクセスできるようにする必要があります。誰かが私に実際にfooの範囲が何であるか、そして私が実際にそれを使用したいスペースをカバーするためにどのように拡張できるかを教えてもらえますか?私の問題を解決する最善の方法は何ですか?
ありがとうございました。私はvars(関数)を理解しようとしています。私が見て、その中にあるものを見ると、functions.pyで定義された変数を含む辞書が得られますが、\ _ \ _ doc \ _ \ _、\ _ \ _builtins \ _ \ _、EOFErrorやSyntaxErrorのようなエラー、eval、hexなどの組み込み関数 余分なものがなくても、私がコード内で実際に定義したことをどうやって得ることができますか? –
@ K.Mao:それはそのモジュールの*完全な名前空間*です。これらの名前はすべて、そのモジュールで実行される式で使用できます。 '_'で始まらない名前や' __all__'で定義されている名前に限定して、その辞書の新しいコピーを作ることができます。 –
別のファイルの完全な名前空間を引数としてevalに渡すのに悪いことはありますか?私は間違いなく内蔵されている重要なものを上書きするか、それとも問題ありませんか? –