2017-09-28 12 views
0

私は使用しているソフトウェアのAPIを使用してスクリプトを作成しています。利用可能なメソッドのドキュメントが不足しているため、私が持つものをほとんど制御できません。私はオブジェクトの中に任意に深く埋め込むことができる変数を呼び出すことを探しています。私は手前の深さを知っていますが、それは広範囲にわたります。任意の深いpythonオブジェクトを呼び出す方法は?

例:

index = ['foo','bar'] 
object['foo']['bar'].method() 

私が何かしようとしました:

temp = object[index[0]] 
for ind in index[1:]: 
    temp = temp[ind] 
temp.method() 

をしかし、このは、オブジェクトのコピー(それが回答によると、私が得ているしません)を行いますメソッドを正しく適用しません。インデックスは任意に長くすることができます。

私の唯一の作業溶液を使用してこれをハードコーディングすることです:

if lengthIndex == 1: 
    object[index[0]].method() 
if lengthIndex == 2: 
    object[index[0]][index[1]].method() 
if lengthIndex == 3: 
    object[index[0]][index[1]][index[2]].method() 
# and so on ... 

これをコーディングする適切な方法は何ですか?

+1

これはコピーを作成しません。 – o11c

+0

少なくとも、私はこれを試したときに.delete()メソッドを適用しませんでした。私はもう一度何かが間違っていたかどうかを調べるつもりです。 – Michele87

+1

あなたが話すこの 'delete()'メソッドは何ですか?ファイナライザ '__del __()'についてあなたが話しているのであれば、それは予想されます。オブジェクトがコピーされているとの結論にいたるまで、私はあなたがどのようになっているのかはっきりしていませんが... –

答えて

1

最初のコードサンプルはオブジェクトをコピーしません。 Pythonでは、変数は参照であり(少なくともの場合はのようになります)、変数に何かを代入すると、メモリアドレスをコピーしているだけで、オブジェクト自体はコピーされません。だから、それを使わない唯一の理由は、オブジェクトの不要なコピーを避けたいということだけだったら、心配する必要はありません。

コードサンプルで行うことは、繰り返しインデックスを処理する方法です。あなたが短いを取得することができます

nested func 
nested func 2 
+0

技術的に知りたい人は、変数ではなく*名前*です。名前はオブジェクトを指し、一部のオブジェクトは変更可能(変更可能)で、一部は変更できません(不変)。 –

+0

あなたの権利はコピーではありません。たぶん、間違っていると、明日に私がアクセスしたときにもう一度試してくれることがあったかもしれません。 – Michele87

+0

@NickT確かに、私はこの答えで技術的なことを明示的には望んでいませんでしたが。 –

0

質問の主なポイントは、インデックス任意にネストされた辞書の機能を求めている場合は、以下を参照してください。関数型プログラミングを介した(必ずしも読みやすい)解決策:

from operator import getitem 
from functools import reduce 

reduce(getitem, index, object).method() 

getitemoperatorは、lambda data, key: data[key]に相当します。

0
In [5]: def get_deep_object(obj, index): 
    ...:  for i in index: 
    ...:   obj = obj[i] 
    ...:  return obj 
    ...: 

In [6]: l = ["foo", "bar"] 

In [7]: get_deep_object(l, [1]) 
Out[7]: 'bar' 

In [8]: get_deep_object(l, [1,1]) 
Out[8]: 'a' 

In [9]: get_deep_object(l, [1,1]).capitalize() 
Out[9]: 'A' 
0

def f(): 
    print('nested func') 

def g(): 
    print('nested func 2') 

def nested_value(nested_dict, keys): 
    for k in keys: 
     nested_dict = nested_dict[k] 
    return nested_dict 


nested_dict = { 
    'foo': { 
     'bar': { 
      'baz': f 
     }, 
     'taco': g 
    } 
} 

keys = ['foo', 'bar', 'baz'] 
val = nested_value(nested_dict, keys) 
val() 

keys = ['foo', 'taco'] 
val = nested_value(nested_dict, keys) 
val() 

出力:

関連する問題