0

という名前の2 つのnumpy配列と という名前dec_pairdec_communityモジュールがありconfig.py、ゼロに初期化されています。

dec_pair = numpy.zeros(200)
dec_community = numpy.zeros(200)

今、私は他のモジュールからそれらにアクセスしようとしています。たとえばroc.py、入力変数に基づいて名前が形成されています。

import config
def dosomething(name):
    local_name = 'config.py'+name
    eval(local_name)[i:] += 1

またはであることがnameできます。問題は、配列の長さ、つまり配列自体ではなくここを返すことです。これにより、次のエラーが発生します。paircommunityeval(local_name)numpy200

ValueError: 0-d 配列をスライスできません

ただし、Python インタープリターで同じことを行うと、スムーズに実行されます。

>>> dec_pair = numpy.zeros(5)
>>> name = 'pair'
>>> local_name = 'dec_'+name
>>> eval(local_name)
array([ 0.,  0.,  0.,  0.,  0.])

私が間違っていることと、それを行う正しい方法は何ですか?

4

2 に答える 2

5

うん。

まず、使わないeval()。あなたは悪い時間を過ごすつもりです。

次に、構成をインポートするだけです。でroc.py

def dosomething(numpy_array):
    return somefunction(numpy_array)

他のモジュールでは:

import roc
import config
someresult = roc.somefunction(config.dec_pair)

編集:質問を読み直した後、グローバルな値を使用しようとしていると思います。これはほとんどの場合、設計が不十分であることを示しています。「グローバル」変数の使用を単一のスクリプトに制限し、関数を使用してそれらのオブジェクトを渡す必要があります。

于 2012-07-23T18:41:26.507 に答える
3

あなたがやろうとしていることは悪い考えのように見えます(あなたが何をしようとしているのかを理解するのに苦労していますが)。

私の最初の本能は、おそらく構成ファイル numpy.zeros(200)の代わりに必要だと言うことです。numpy.array(200)

第二に、このようなものをインポートする場合、データを取得するために ではなくglobals()[local_name]orを使用できる可能性がありますが、それでも間違いなく悪い習慣です (つまり、これを行わないでください - ポイント 3 を参照してください)。vars(config)[local_name]eval

第三に、事前に変数の名前がわからない場合は、辞書を使用して開始する必要があります

#config.py
dec={'pair':np.zeros(200), 'community':np.zeros(200)}

関数内で次のようにアクセスするだけです。

a=config.dec[name]
a[i:]+=1

dec_pairとをより簡単に処理したい場合はdec_community、次のようにすることができますconfig.py

dec_pair=np.zeros(200)
dec_community=np.zeros(200)
dec={'pair':dec_pair, 'community':dec_community}

おそらく、参照するデータを 1 か所だけに留めておくのが最善だと思いますが、API の一貫性などを本当に維持する必要がない限り、これを行うことには注意してください。

最後に、変数の値が何であるかについて言及していませんi。現在の名前空間の外部にある変数にアクセスすることはしばしば危険であり、名前が付けられた変数iはおそらくさらに危険です。

于 2012-07-23T18:54:39.130 に答える