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.