Czy niewidomy użytkownik JAWS może napisać prosty skrypt w języku Python?
Mówi się, że najlepiej uczyć się na własnych błędach. Sprawdza się to szczególnie podczas nauki programowania w języku Python i nie tylko. Jeżeli pisząc kod popełnimy błąd, który następnie sami znajdziemy i poprawimy, to mamy z tego powodu nie tylko wielką frajdę, ale gwarancję, że zapamiętamy ten błąd na długo i więcej go nie powtórzymy.
Zatem celowo popsujmy coś w poprawnie działającym skrypcie, aby zobaczyć, co się stanie.
Jeżeli korzystamy z PythonWin, to występują dwa główne typy błędów, które możemy analizować za pomocą IDE. Najczęstszym jest błąd w składni, co zwykle oznacza, że wpisaliśmy coś niepoprawnie w kodzie skryptu.
W części pierwszej napisaliśmy poprawnie działający skrypt zawierający dwie linie kodu. Otwórzmy do edycji ten skrypt lub utwórzmy nowy, który będzie składał się z jednego wiersza kodu, a mianowicie:
print(„”Hello, World””)
Ten skrypt działa poprawnie. Spróbujmy zmienić zawartość skryptu na następującą:
print(„Hello, World)
Tutaj specjalnie usunęliśmy końcowy znak cudzysłowu, co oczywiście jest błędem, teraz Python nie będzie w stanie stwierdzić, gdzie kończy się ciąg tekstu. Zapisz skrypt i spróbuj go uruchomić. Co się dzieje?
…
Nie możesz go uruchomić! IDLE jest wystarczająco inteligentny, aby zdać sobie sprawę z błędu w kodzie i nawet nie pozwala uruchomić błędnego programu.
W tym przypadku oznajmia błąd:
„”Failed to run script, syntax error, EOL while scanning string literal, (nazwa skryptu.py, numer linii zawierającej błąd)””
Możemy odczytać te informacje wyświetlane w pasku stanu, korzystając ze skrótu Insert + Page Down.
Możemy także przejść do interaktywnego okna, ctrl + tab, włączyć kursor JAWS, i dokładnie przeczytać cały komunikat.
„EOL podczas skanowania łańcucha tekstowego”.
EOL oznacza koniec linii, „End Of Line”, czyli interpreter Pythona dotarł do końca linii i nie znalazł poprawnie sformatowanego łańcucha tekstowego. Najczęściej brakuje apostrofu, cudzysłowu lub jakiegoś nawiasu. Dla widzących, IDLE nawet podświetla miejsce, w którym wystąpił błąd, używając innego koloru i przesuwa kursor do lokalizacji błędu. Bardzo cenne informacje!
Możemy teraz usunąć błąd wstawiając brakujący cudzysłów, i ponownie wykonać skrypt wciskając klawisz F5.
Teraz w pasku stanu IDE oznajmia:
„”Script 'nazwa skryptu.py’, returned exit code 0″”
Zwracany kod wykonania skryptu to 0, zatem nie ma żadnych błędów.
W naszym działającym skrypcie ponownie wprowadźmy błąd. Przed poleceniem print(…), wpiszmy dwie spacje, wciskając dwukrotnie klawisz spacji, po uprzednim ustawieniu kursora przed literą 'p’. Teraz po próbie wykonania skryptu naciskając klawisz F5, IDE w pasku stanu oznajmi błąd:
„”… unexpected indent … „”
„”… nieoczekiwane wcięcie …””
Poprawna struktura wcięć linii kodu w Pythonie jest kluczowa dla tego języka programowania i poświęcimy tej kwestii kolejną część omówienia.
Powyżej opisano błędy, które IDE potrafi wychwycić jeszcze przed uruchomieniem skryptu. Ale istnieje klasa błędów, które IDE wskazuje dopiero po uruchomieniu skryptu, są to tak zwane run time error, błędy czasu przetwarzania.
Spróbuj zmienić kod w skrypcie na:
print(Hello, world)
Teraz całkowicie usunęliśmy oba cudzysłowy z tekstu. Dla widzącego użytkownika, zauważ, jak zmienia się kolor tekstu, gdy to zrobiliśmy? IDLE informuje nas, że nie jest to już ciąg tekstu, który będziemy wyświetlać, ale coś innego. Co teraz robi nasz kod? Zapisz skrypt i spróbuj go uruchomić …
IDE w pasku stanu oznajmia nam, że:
„”Exception raised while running script nazwaskryptu.py code number””
„”Wystąpił wyjątek podczas wykonywania skryptu, nazwa skryptu.py, kod błędu””
Natomiast w interaktywnym oknie pojawił się czerwony tekst, który wygląda mniej więcej tak:
Początek cytatu:
Traceback:
sprawdzanie wsteczne, ciąg wywołań podprogramów prowadzący do danego punktu programu, w którym wystąpił błąd.
(most recent call last):
pierwsze wywołanie wyjątku znajduje się na końcu poniższej listy:
File „”C:\ katalog roboczy \ pierwszyskrypt.py””, line number, in
print(Hello, World)
NameError: name 'Hello’ is not defined
Plik „” ścieżka do skryptu naszskrypt.py””, wiersz 1, w
print(Hello, World)
NameError: nazwa „Hello” nie jest zdefiniowana
Koniec cytatu.
Więc co się stało? Python mówi nam kilka rzeczy:
• Wystąpił błąd, a dokładniej Python nazywa go błędem określenia nazwy, Error-Name.
• Błąd wystąpił w linii 1 skryptu
• wiersz kodu, który wygenerował błąd, to:
print(Hello, World)
• wskazany błąd to: nazwa „Hello” nie jest zdefiniowana.
Jest to tak zwany błąd czasu przetwarzania, ponieważ występuje dopiero po uruchomieniu programu. Po usunięciu cudzysłowów przed Hello, i po World, Python nie wiedział, że to tekst, który chcemy wydrukować. Zamiast tego interpretował nasz kod tak, że mamy na myśli dwie zmienne, których wartości chcieliśmy wyświetlić. Pierwszą zmienną, którą próbował wyświetlić, było coś o nazwie „Hello”, ale ponieważ nie zdefiniowaliśmy zmiennej o nazwie „Hello”, nasz program zakończył działanie i wygenerował opis błędu.
Na koniec naprawimy ten błąd, ale w inny sposób. Zdefiniujemy dwie zmienne, i uwzględnimy polskie znaki diakrytyczne. Przykładowy skrypt ma postać jak niżej:
–– coding: utf-8 ––
Hello = u’Witaj’
World = u’Świecie’
print(Hello, World)
Pierwszy wiersz w tym skrypcie ustawia kodowanie znaków w danym pliku, w naszym przypadku jest to kodowanie w standardzie utf-8. Pozwala to na korzystanie z polskich znaków diakrytycznych w łańcuchach tekstowych lub plikach tekstowych. To musi być zawsze pierwszy wiersz w pliku z kodem naszego skryptu. Możemy tutaj określić inne kodowanie. Nie stosujemy polskich znaków diakrytycznych do nazw zmiennych lub stałych itp.
Litera 'u’, przed łańcuchem tekstowym ograniczonym przez '…’ oznacza, że stosujemy kodowanie unikodowe w tekście.