Recursivamente dir () um objeto python para encontrar valores de um determinado tipo ou com um determinado valor

Eu tenho uma estrutura de dados complexa do Python (se é importante, é um grande objeto music21 Score) que não irá contruir devido à presença de um weakref em algum lugar dentro da estrutura do objeto. Depurei esses problemas com o rastreamento de pilha e o depurador python antes, mas é sempre uma grande dor. Existe uma ferramenta que executa dir () recursivamente em todos os atributos de um objeto, encontrando objetos escondidos em listas, tuplas, dicts, etc., e retorna aqueles que correspondem a um certo valor (uma função lambda ou algo parecido). Um grande problema são as referências recursivas, então é necessário algum tipo de função de memorando (como o copy.deepcopy usa). Eu tentei:

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

Eu provavelmente posso continuar a tapar buracos nesteiter não é o que eu quero para os ditadores, por exemplo), mas antes de jogar mais tempo, me pergunto se alguém sabe uma resposta mais fácil. Pode ser uma ferramenta geral bastante útil.

questionAnswers(2)

yourAnswerToTheQuestion