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.