0

次の標準的なインポート手順があります。

from ROOT import *

ROOT がコマンド ライン オプションと引数を処理する方法のため、スクリプトのコマンド ライン解析を台無しにしないために、次のようなものが必要です。

argv_tmp = sys.argv
sys.argv = []
from ROOT import *
sys.argv = argv_tmp

多くのスクリプトでこの操作を実行する必要があります。この操作は変更されるか、より良い方法が見つかる可能性があるため、この手順をインポートされたモジュールが提供する単一の関数に集中させ、将来の手順の変更を容易にしたいと考えています。

def import_ROOT():
    # magic

import os
import sys
import_ROOT()
import docopt

from ROOT import *スクリプトの操作の結果が上記の手順と同じになるように、ROOT モジュールを関数内からインポートするにはどうすればよいですか?

4

3 に答える 3

2

Python でローカル変数がどのように実装されているかにより、これを行うことはできません。また、インポートされる可能性のあるすべての変数を知っているわけではないため、それらをグローバルに宣言することはできません。

関数に不明なローカルをインポートできない理由について。これは、コンパイル時に python が存在する可能性のあるさまざまなローカル (直接割り当てられ、グローバルまたは非ローカルとして宣言されていないもの) をすべて確立するためです。これらのローカル用のスペースは、関数の各呼び出しに関連付けられた配列に作成されます。すべてのローカルは、名前ではなく、配列内のインデックスによって参照されます。したがって、インタープリターは、不明なローカルに対して追加のスペースを作成することも、実行時にそれらを参照する方法を知ることもできません。

于 2015-11-02T19:45:28.147 に答える
0

これはおそらくあらゆる種類のコーナーケースを見逃していますが、それは始まりです:

def import_ROOT():
    import ROOT
    globals().update(ROOT.__dict__)

必須の免責事項: * をインポートしている場合は、おそらく間違っています。しかし、 import * が悪さを軽減する状況もあると思います。

于 2015-11-02T21:23:01.737 に答える