Recursivamente dir () un objeto python para encontrar valores de un tipo determinado o con un valor determinado

Tengo una estructura de datos de Python compleja (si es importante, es un gran objeto de Partitura de música21) que no decapitará debido a la presencia de una referencia débil en algún lugar dentro de la estructura del objeto. He depurado tales problemas con el seguimiento de pila y el depurador de Python antes, pero siempre es un gran dolor. ¿Existe una herramienta que ejecute dir () recursivamente en todos los atributos de un objeto, encontrando objetos ocultos en listas, tuplas, dados, etc. y devuelva aquellos que coincidan con un cierto valor (una función lambda o algo así)? Un gran problema son las referencias recursivas, por lo que se necesita algún tipo de función memo (como los usos copy.deepcopy). Lo intenté:

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

Probablemente pueda continuar tapando agujeros en esteiter no es lo que me gustaría para los dictados, por ejemplo), pero antes de dedicarle más tiempo, me pregunto si alguien sabe una respuesta más fácil. Podría ser una herramienta general bastante útil.

Respuestas a la pregunta(2)

Su respuesta a la pregunta