【发布时间】:2016-12-15 18:08:41
【问题描述】:
我正在尝试扫描 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)
如果这可以通过继承的递归函数来完成,而不是像我在上面尝试做的那样为每个孩子定义单独的循环方法,则可以加分。最后一点:我正在尝试编写兼容 Python 2.7 的代码。提前致谢!
【问题讨论】:
-
我刚刚浏览了代码,但看起来这可能是装饰器的工作。您是否足够熟悉它们以确定它们是否可以解决您的问题?
-
Parent中缩进最多的行应该是self.result[i] = query_func()还是self.result[i] = query_func(x)? -
我只对你如何获取数据的 python 接口感兴趣,所以你会有一个
query_valueX()来生成一个值?它的论点是什么?您会在生成 numpy 数组之外重用instA, instB, instC信息(.result、.resultA等)吗? -
抱歉,我并没有真正澄清任何事情,您仍然在实际循环代码中使用
query_func(x)带参数,但在编辑中没有参数的函数我仍然看不到它们之间的关系,您同样使用ChildA.loop它在调用时返回一个函数 作为query_func到ChildB.loop这将导致您的数组填充innerloop函数这不可能是你想要的...... -
假设
response最终是一个嵌套列表,最后可以保留的唯一数据来自最内部的对象,所以我认为此时你真的需要分享更具体的有关您正在尝试做什么的信息,或者您可能不完全了解您想要什么(一直发生在我身上)在这种情况下,您应该考虑最终产品应该用于/能够用于什么。
标签: python function loops oop recursion