我创建了一个函数,它接受一个值,进行一些计算并将不同的答案作为对象返回。但是当我尝试并行化代码时,使用pp,我得到以下错误。
文件“trmm.py”,第8行, getattr return self.header_array [name] RuntimeError:调用Python对象时超出了最大递归深度
这是我想要做的简单版本。
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()
如果我改变返回tplObj以返回[tplObj.longitude,tplObj.latitude]则没有问题。但是,正如我之前所说的,这是一个简单版本,实际上这种改变会使程序复杂化。
我非常感谢任何帮助。
答案 0 :(得分:1)
你几乎从不需要使用getattr和setattr,它几乎总是会有一些东西爆炸,无限递归就是典型的效果。我也无法在这里看到任何使用它们的理由。明确并直接使用line和header_array词典。
如果您想要一个在所有数组上查找值的函数,请为其创建一个函数并显式调用它。调用函数__getitem__
并使用[]是显式的。 : - )
(请不要将字典称为“header_ 数组”,这令人困惑)。