n
オブジェクトの反復可能なプロパティをスキャンしようとしています。 pythonicループをレベルアップしてメソッド呼び出しに関数を渡すことで、任意の深さのネストループで関数を実行する方法を探しています。私は深さが3のときに最も内側のループを実行する以上のことはできませんでした。ここでは、ループ内の各ポイントで異なる値を照会している非動作のPython擬似コードがあります。他の難しさ、私は出力をキャプチャしてメソッドオブジェクトを渡して任意の深さにループをネストする
class Parent(object):
def __init__(self):
self.iterable = [None] * 2
self.result = self.iterable[:]
def loop(self, query_func):
def innerloop():
for i, x in enumerate(self.iterable):
self.result[i] = query_func(x)
return self.result[:]
return innerloop
class ChildA(Parent):
def __init___(self, A, object_to_queryA):
self.iterableA = [valueA for valueA in range(A)]
self.resultA = self.iterableA[:]
self.object_to_query = object_to_queryA
def query_valueA(self, x):
return self.object_to_query.some_query_function(x)
class ChildB(Parent):
def __init___(self, B, object_to_queryB):
self.iterableB = [valueB for valueB in range(B))]
self.resultB = self.iterableB[:]
self.object_to_query = object_to_queryB
def query_valueB(self, x):
return self.object_to_query.some_other_query_function(x)
class ChildC(Parent):
def __init___(self, C, , object_to_queryC):
self.iterableC = [valueC for valueC in range(C))]
self.resultC = self.iterableC[:]
self.object_to_query = object_to_queryC
def query_valueC(self, x):
return self.object_to_query.yet_another_query_function(x)
を渡ししようとしていますされて、私は次のようにこれらのループを呼び出すことができるようにしたい:
import numpy
query_objA, query_objB, query_objC = (SomeObjA(), SomeObjB(), SomeObjC())
A, B, C = (len(query_objA.data), len(query_objB.data), len(query_objC.data))
instA = ChildA(A, query_objA)
instB = ChildB(B, query_objB)
instC = ChildC(C, query_objC)
my_scanning_func = ChildA.loop(ChildB.loop(ChildC.loop))
my_queries = numpy.array(my_scanning_func()).reshape(A,B,C)
# Equally valid call example below:
my_scanning_func2 = ChildB.loop(ChildC.loop(ChildA.loop))
my_queries2 = numpy.array(my_scanning_func2()).reshape(B,C,A)
究極の機能イム探し
for i, x in enumerate(query_objA.data):
response[i] = instA.some_query_function(x)
for j, y in enumerate(query_objB.data):
response[i][j] = instB.some_other_query_function(y)
for k, z in enumerate(query_objC.data):
response[i][j][k] = instC.yet_another_query_function(z)
ボーナスポイント、これはむしろ別のループメトを規定よりも、継承された再帰関数を介して行うことができれば下記に類似するが、任意の深さと順序のためになるため私が上にしようとしたように、各子供のためのds。最後の注意:私はPython 2.7互換のコードを書こうとしています。前もって感謝します!
私はちょうどコードを見てきましたが、それはデコレータの仕事かもしれないようです。彼らがあなたの問題を解決できるかどうかを判断するのに十分に精通していますか? –
'Parent'の最もインデントされた行は' self.result [i] = query_func() 'または' self.result [i] = query_func(x) 'でしょうか? –
配列の実際の値はどこから来ますか? –