Próbuję przekonwertować dane z prostego wykresu obiektów do słownika. Nie potrzebuję informacji o typie ani metod i nie muszę mieć możliwości ponownego przekonwertowania ich z powrotem na obiekt.Rekurencyjnie przekonwertuj wykres obiektu Pythona do słownika
Znalazłem this question about creating a dictionary from an object's fields, ale nie robi tego rekurencyjnie.
Będąc stosunkowo nowym pytonem, jestem zaniepokojony, że moje rozwiązanie może być brzydkie, niepytikonowe lub zepsute w jakiś niejasny sposób, lub po prostu stary NIH.
Moja pierwsza próba zadziałała, dopóki nie wypróbowałem jej z listami i słownikami, i wydawało mi się łatwiej po prostu sprawdzić, czy obiekt przeszedł z wewnętrznym słownikiem, a jeśli nie, po prostu potraktować to jako wartość (zamiast robić to wszystko, co sprawdza instynktownie). Moje dotychczasowe próby również nie rekursja do listy obiektów:
def todict(obj):
if hasattr(obj, "__iter__"):
return [todict(v) for v in obj]
elif hasattr(obj, "__dict__"):
return dict([(key, todict(value))
for key, value in obj.__dict__.iteritems()
if not callable(value) and not key.startswith('_')])
else:
return obj
To wydaje się działać lepiej i nie wymagają wyjątków, ale znowu ja nadal nie jestem pewien, czy istnieją przypadki tutaj nie jestem świadomy gdzie spadnie.
Wszelkie sugestie będą mile widziane.
w python nie jest tak źle w użyciu wyjątki i czasami może to uproszczenie kodowania, a pythonic drodze, EAFP (Łatwiej prosić o przebaczenie niż uprawnienia) –
szczególny przypadek mógłby być, gdy obiekt ma __slots__, zredagowana odpowiedź: –
punkt wzięty, ale wyjątek jest trochę świętej wojny i mam tendencję do preferowania, aby nigdy nie były rzucane, chyba że coś jest naprawdę wyjątkowe, a nie oczekiwany przepływ programu. każdy na swój własny na tym :) – Shabbyrobe