在并行Python中返回对象(类)
我创建了一个函数,它接受一个值,进行一些计算,并作为一个对象返回不同的答案。然而,当我尝试使用pp并行化代码时,我得到了以下错误 文件trmm.py,第8行,在getattr中 返回self.header\u数组[名称] RuntimeError:调用Python对象时超出了最大递归深度 下面是我试图做的一个简单版本在并行Python中返回对象(类),python,parallel-processing,Python,Parallel Processing,我创建了一个函数,它接受一个值,进行一些计算,并作为一个对象返回不同的答案。然而,当我尝试使用pp并行化代码时,我得到了以下错误 文件trmm.py,第8行,在getattr中 返回self.header\u数组[名称] RuntimeError:调用Python对象时超出了最大递归深度 下面是我试图做的一个简单版本 class DataObject(object): """ Class to handle data objects with several arrays.
class DataObject(object):
"""
Class to handle data objects with several arrays.
"""
def __getattr__(self, name):
try:
return self.header_array[name]
except KeyError:
try:
return self.line[name]
except KeyError:
raise AttributeError("%s instance has no attribute '%s'" %(self.__class__.__name__, name))
def __setattr__(self, name, value):
if name in ('header_array', 'line'):
object.__setattr__(self, name, value)
elif name in self.line:
self.line[name] = value
else:
self.header_array[name] = value
class TrmmObject(DataObject):
def __init__(self):
DataObject.__init__(self)
self.header_array = {
'header': None
}
self.line = {
'longitude': None,
'latitude': None
}
if __name__ == '__main__':
import pp
ppservers = ()
job_server = pp.Server(2, ppservers=ppservers)
def get_monthly_values(value):
tplObj = TrmmObject()
tplObj.longitude = value
tplObj.latitude = value * 2
return tplObj
job1 = job_server.submit(get_monthly_values, (5,), (DataObject,TrmmObject,),("numpy",))
result = job1()
如果我将return-tplObj更改为return[tplObj.longitude,tplObj.latitude],则没有问题。然而,正如我之前所说的,这是一个简单的版本,实际上,这个更改会使程序复杂很多
我非常感谢您的帮助。您几乎不需要使用getattr和setattr,并且它几乎总是以一些事情结束,无限递归就是一个典型的效果。我也看不出有什么理由在这里使用它们。要明确,直接使用行和头数组字典 如果需要一个在所有数组中查找值的函数,请为此创建一个函数并显式调用它。调用函数uu getitem_uuu并使用[]是显式的:-
另外,请不要调用字典头数组,这会让人困惑。关于名称头数组,您完全正确,我会更改它。使用getattr和setattr的原因是,我可以编写obj.longitude而不是obj.line['longitude'],其中obj=TrmmObject,而且如果我使用非预定义属性,它将在header_数组下结束,例如obj.names='bla'。埃里克:是的,编写obj.longitude而不是obj.line['longitude']不是使用getattr和setattr的好理由。也许不是。如果我按照建议删除DataObject,它确实可以工作。然而,在我的实际程序中,我经常使用setattr和getattr。那么,有什么方法可以让它在数据对象仍然存在的情况下工作吗?@Erik:可能,但因为它只是并行化时的一个问题,它可能是某种竞争条件,这肯定不容易修复。