0

値を取り、いくつかの計算を行い、さまざまな答えをオブジェクトとして返す関数を作成しました。ただし、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()

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 に答える