jesteś tutaj�
483
Zaawansowana iteracja
Zachowaj ostrożność, łącząc wywołania metod w łańcuch
Niektórzy programiści nie są zachwyceni faktem, że język Python umożliwia łączenie wywołań metod w łańcuchy
(jak ma to miejsce w przypadku metod
strip
i
split
przedstawionych na poprzedniej stronie), ponieważ
łańcuchy tego rodzaju mogą być mało czytelne, gdy widzi się je po raz pierwszy. Zastosowanie tej techniki jest
jednak bardzo popularne wśród programistów Pythona, dlatego z pewnością nieraz zdarzy Ci się z nią zetknąć,
gdy będziesz korzystał z kodu napisanego przez kogoś innego. Należy tu zachować szczególną ostrożność,
ponieważ kolejność wywołań metod
nie może być bezkarnie zmieniana.
Przykład tego, co może pójść źle, został przedstawiony poniżej. Przyjrzyj się temu kodowi (który jest bardzo
podobny do tego, który został przedstawiony wcześniej). Podczas gdy w poprzednim przykładzie najpierw
występowała metoda
strip
, a potem
split
, w tym kodzie najpierw wywoływana jest metoda
split
,
a następnie
strip
. Zobacz, co w takiej sytuacji się dzieje.
Kolejność metod
połączonych
w łańcuch została
tutaj odwrócona
względem tego,
czego używałeś
wcześniej.
Interpreter nie wydaje
się zachwycony i mamy
do czynienia z awarią;
zgłoszonym błędem jest
AttributeError.
Aby zrozumieć, co się tu dzieje, zastanów się nad typem danych znajdujących się z prawej strony operatora
przypisania w trakcie wykonania łańcucha metod pokazanego powyżej.
Zanim cokolwiek się stanie, zmienna
line
jest łańcuchem znakowym. Wywołanie metody
split
na rzecz łańcucha
znakowego powoduje zwrócenie listy łańcuchów, przy czym jako separator używany jest argument przekazany tej
metodzie. To, co na początku było
łańcuchem znakowym (zmienną
line
), zostało dynamicznie przekształcone
w
listę, na rzecz której została następnie wywołana kolejna metoda. W tym przykładzie była nią metoda
strip
,
która powinna być wywoływana na rzecz łańcucha znakowego,
nie zaś na rzecz listy, w związku z czym interpreter
zgłasza wyjątek
AttributeError
, jako że listy nie zapewniają metody o nazwie
strip
.
Łańcuch metod przedstawiony na poprzedniej stronie nie cierpi na tę przypadłość, o czym można się przekonać
poniżej.
...
line.strip().split(‘,’)
...
W przypadku tego kodu interpreter zaczyna od przetwarzania łańcucha znakowego (przechowywanego w zmiennej
line
), z którego za pomocą metody
strip
usuwane są znajdujące się na początku lub końcu białe znaki, co
daje w wyniku kolejny łańcuch znakowy, który jest następnie dzielony na listę łańcuchów znakowych przy użyciu
separatora będącego przecinkiem. Nie występuje tu wyjątek
AttributeError
, ponieważ łańcuch metod nie narusza
żadnych reguł typowania.
Get Python Rusz głową! Wydanie II now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.