Rekurencyjnie dir () obiekt Pythona w celu znalezienia wartości określonego typu lub o określonej wartości

Mam złożoną strukturę danych Pythona (jeśli ma to znaczenie, jest to duży obiekt Music21 Score), który nie będzie trawił ze względu na obecność słabego źródła gdzieś głęboko w strukturze obiektu. Wcześniej debugowałem takie problemy z debugerem stosu śledzenia i pytonem, ale zawsze jest to duży problem. Czy istnieje narzędzie, które uruchamia rekursywnie dir () na wszystkich atrybutach obiektu, znajdując obiekty ukryte na listach, krotkach, dyktach itp. I zwraca te, które pasują do określonej wartości (funkcja lambda lub coś podobnego). Dużym problemem są referencje rekurencyjne, więc potrzebna jest jakaś funkcja memo (np. Copy.deepcopy). Próbowałem:

import weakref
def findWeakRef(streamObj, memo=None):
    weakRefList = []
    if memo is None:
        memo = {}
    for x in dir(streamObj):
        xValue = getattr(streamObj, x)
        if id(xValue) in memo:
            continue
        else:
            memo[id(xValue)] = True
        if type(xValue) is weakref.ref:
            weakRefList.append(x, xValue, streamObj)
        if hasattr(xValue, "__iter__"):
            for i in xValue:
                if id(i) in memo:
                    pass
                else:
                    memo[id(i)] = True
                    weakRefList.extend(findWeakRef(i), memo)
        else:
            weakRefList.extend(findWeakRef(xValue), memo)
    return weakRefList

Prawdopodobnie mogę kontynuować podłączanie dziur w tym (iter na przykład nie to, czego bym chciał dla dyktatów), ale zanim wrzucę w to więcej czasu, zastanawiam się, czy ktoś zna łatwiejszą odpowiedź. To może być całkiem przydatne narzędzie ogólne.

questionAnswers(2)

yourAnswerToTheQuestion