0

我创建了一个函数,它接受一个值,进行一些计算并将不同的答案作为一个对象返回。但是,当我尝试使用 pp 并行化代码时,出现以下错误。

文件“trmm.py”,第 8 行,在getattr 返回 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()

如果我将 return tplObj 更改为 return [tplObj.longitude, tplObj.latitude] 就没有问题。但是,正如我之前所说,这是一个简单的版本,实际上这种更改会使程序复杂化很多。

我非常感谢任何帮助。

4

1 回答 1

1

您几乎从不需要使用 getattr 和 setattr,而且它几乎总是会导致某些事情发生爆炸,而无限递归就是这种情况的典型效果。我也看不出有任何理由在这里使用它们。明确并直接使用 line 和 header_array 字典。

如果您想要一个在所有数组中查找值的函数,请为此创建一个函数并显式调用它。调用函数__getitem__并使用 [] 是明确的。:-)

(并且请不要将字典称为“header_array ,这会令人困惑)。

于 2013-02-01T11:12:01.700 回答