2011-10-26 17 views
3

私はPythonでプログラミングしています。これを文字列(別の文字列で連結)として渡せるように、オブジェクトに与えた名前にアクセスする必要があります。Pythonで与えられた変数の名前にアクセスするにはどうすればいいですか?

私はこれを行う必要がある理由は、私が使用しているプログラムがグローバル(私の場合は辞書です)を作成することを強制し、一般的にいくつかの異なるオブジェクト(それぞれ例えば、オブジェクト1は、0と1とラベル付けされた長さ2(私の場合は2つのニューロンを示す)であり、それぞれに4つのプロパティーa、b、c、dがあります。 "dictionary filetree"これらのプロパティのうちオブジェクト1とオブジェクト2の両方が同じクラスの2つのインスタンスであるため、最初のレベルのキーを 'NAME1_0'、 'NAME1_1'、 'NAME2_0'、 'NAME2_1'に変更する必要があります。

def Init(neuron,input): 
#Initialises the neuron group, arguements are neuron (neurongroup) and input (neurongroup) 
global dict 
dict={} 
for x in range(0,len(neuron)): 
    neuron[x].L=0 
    neuron[x].G=0 
    neuron[x].ron=1/period 
    neuron[x].roff=1/period 
    dict[x]={'tau_on':0.5, 
      'Non_off':neuron[x].roff*0.5, 
      'Non_off':neuron[x].ron*0.5, 
      'Ni_on':ones(len(input))*qon*0.5, 
      'Ni':ones(len(input))*qoff*0.5+ones(len(input))*qon*0.5, 
      'p_current':0, 
      'p_previous':0, 
      'my_tau_on':[], 
      'my_Non_off':[], 
      'my_Noff_on':[], 
      'my_Ni_on':[], 
      'my_Ni':[], 
      'my_p_on':[], 
      'my_ron':[], 
      'my_roff':[], 
      'my_theta':[], 
      'my_weights':[], 
      'my_record_times':[]} 
    dict['%s' % x, neuron]=dict.pop(x) 

は、オブジェクトに割り当てられた名前ではなく、オブジェクト自体の名前を与えるため、機能しません。私の問題

NAME1=4 
def func(x): #creates string of 'NAME1' 
    print 'x' 

func(NAME1) 
#output='NAME1' 
+0

を「より良い方法があるに違いありません」。 'func(NAME1)'では、 'NAME1'という式が最初に評価されてから*結果の値*が' func'関数に渡され、 'x'パラメータに代入されることに注意してください。 –

+0

dictはキーワードです。名前として使用すると、dictオブジェクトのプロパティがオーバーライドされます –

+1

Neuronクラスに '.name'属性を追加するだけの理由はありますか?ところで、Pythonistはこの 'range(len(...))'構造に目を向けます;シーケンスを直接反復するだけです。あなたが本当に本当にインデックスを必要とするなら(ほとんどの場合はそうではありません)、それが '列挙'の目的です。 –

答えて

8

のより最小限の場合のためにあなたがグローバルに名前の逆引きを行うことができます():

>>> NAME1 = 4 
>>> def name_of(value): 
     for k, v in globals().items(): 
      if v is value: 
       return k 
     raise KeyError('did not find a name for %s' % value) 

>>> name_of(NAME1) 
'NAME1' 

同じオブジェクトが複数の名前に割り当てられている場合のみ、 1つの名前が返されます。

あなたは、より広くちょうどグローバルより検索gc.get_referrers(value)にdictsを探し、すべての一致キャプチャしたい場合:

>>> def names_of(value): 
     'Find all names for the value' 
     result = [] 
     for d in gc.get_referrers(value): 
      if isinstance(d, dict): 
       for k, v in d.items(): 
        if v is value: 
         result.append(k) 
     return result 

>>> import math 
>>> pie = math.pi 
>>> names_of(pie) 
['pie', '_pi', 'pi', 'pi'] 
+3

賛成ですが、私はこれが使われているのを見るために泣きそうになりました。 –

+0

これはとても凄く邪悪で、私は一度に笑い、泣き、応援したいです。 –

+2

'' gc.get_referrers'の前に '' gc.collect() 'を呼び出して、潜在的な" extras "を避けるべきです。ドキュメントから: "既に逆参照されているが、周期的に生きていて、ガベージコレクタによってまだ収集されていないオブジェクトは、結果の参照元の中にリストされることに注意してください。 get_referrers()。 " –

関連する問題