Jest to mniej pytanie o naturę pisania kaczek, a raczej o pozostawanie pythonem, jak sądzę.
Po pierwsze - w przypadku dykt, w szczególności gdy struktura dykt jest dość przewidywalna, a dany klucz nie jest zwykle obecny, ale czasami tak jest, najpierw myślę o dwóch podejściach:
if myKey in dict:
do_some_work(dict[myKey])
else:
pass
I oczywiście podejście Ye Olde „wybaczenie vs pozwolenie”.
try:
do_some_work(dict[myKey])
except KeyError:
pass
Jako czeladnik Python, wydaje mi się, że widzę, że ten drugi bardzo go preferuje, co wydaje mi się dziwne, ponieważ w Pythonie dokumenty try/excepts
wydają się preferowane, gdy występuje rzeczywisty błąd, a nie… um… brak sukcesu?
Jeśli okazjonalny dykta nie ma klucza w myDict i wiadomo, że nie zawsze będzie miał ten klucz, to czy próba / próba kontekstu wprowadza w błąd? To nie jest błąd programistyczny, to tylko fakt danych - ten dykta po prostu nie miał tego konkretnego klucza.
Wydaje się to szczególnie ważne, gdy spojrzysz na składnię try / wyjątek / else, która wydaje się bardzo przydatna, jeśli chodzi o upewnienie się, że try nie wykryje zbyt wielu błędów. Możesz zrobić coś takiego:
try:
foo += bar
except TypeError:
pass
else:
return some_more_work(foo)
Czy to nie doprowadzi do przełknięcia wszelkiego rodzaju dziwnych błędów, które prawdopodobnie są wynikiem złego kodu? Powyższy kod może po prostu uniemożliwić zauważenie, że próbujesz dodać, 2 + {}
i możesz nigdy nie zdawać sobie sprawy, że pewna część kodu poszła strasznie źle. Nie sugeruję, że powinniśmy sprawdzać wszystkie typy, dlatego jest to Python, a nie JavaScript - ale znowu w kontekście try / wyjątkiem wydaje się, że powinien złapać program robiąc coś, czego nie powinien, zamiast tego umożliwienia kontynuacji.
Zdaję sobie sprawę, że powyższy przykład jest czymś w rodzaju kłótni i rzeczywiście jest celowo zły. Ale biorąc pod uwagę pytonowe wyznanie wiary, better to ask forgiveness than permission
nie mogę przestać czuć, że rodzi się pytanie, gdzie linia na piasku faktycznie znajduje się między poprawnym zastosowaniem if / else vs try / wyjątek, w szczególności gdy wiesz, czego się spodziewać po dane, z którymi pracujesz.
Nie mówię tu nawet o problemach z szybkością ani o najlepszych praktykach, jestem po prostu trochę zdezorientowany przez postrzegany schemat Venna przypadków, w których wygląda na to, że może pójść w obie strony, ale ludzie mylą się po stronie próby / z wyjątkiem ponieważ „ktoś gdzieś powiedział, że to Python”. Czy wyciągnąłem błędne wnioski na temat zastosowania tej składni?