Czy istnieje sposób na przekonwertowanie wcięć w kodzie Pythona na nawiasy klamrowe?

82

Jestem całkowicie niewidomym programistą, który chciałby nauczyć się Pythona. Niestety fakt, że bloki kodu są reprezentowane z różnymi poziomami wcięć, jest główną przeszkodą. Zastanawiałem się, czy są dostępne jakieś narzędzia, które pozwoliłyby mi napisać kod za pomocą nawiasów klamrowych lub innego ogranicznika bloku kodu, a następnie przekonwertować ten format na odpowiednio wciętą reprezentację, której mógłby użyć interpreter Pythona?

Jared
źródło
Z ciekawości, jakiego systemu operacyjnego używasz?
Ryan
4
Ale dlaczego spacje i łamanie linii są problemem. Czy nie jest możliwe, aby czytnik tekstu wypowiadał znaki niedrukowalne?
e-satis
2
Wydaje się, że to przepis na katastrofę - nie znam wielu osób, które chciałyby posłuchać „przestrzeni kosmicznej przestrzeni kosmicznej przestrzeni kosmicznej def foo” przed każdą linią.
javawizard
@javawizard może działać, podając „def foo dwukropek, następna linia, zwiększenie wcięcia, ...” lub „poziom wcięcia 0, def foo dwukropek, wcięcie następnej linii poziom 1, ...”
smoothdeveloper
@smoothdeveloper Absolutnie, i właśnie o to pyta autor.
javawizard

Odpowiedzi:

57

Istnieje rozwiązanie twojego problemu, które jest dystrybuowane z samym Pythonem. pindent.py, znajduje się w katalogu Tools \ Scripts w instalacji systemu Windows (moja ścieżka do niego to C: \ Python25 \ Tools \ Scripts), wygląda na to, że musisz go pobrać z svn.python.org, jeśli używasz Linux lub OSX.

Dodaje komentarze, gdy bloki są zamknięte, lub może prawidłowo wciskać kod, jeśli są wstawiane. Oto przykład kodu wyświetlanego przez pindent za pomocą polecenia:

pindent.py -c myfile.py

def foobar(a, b):
   if a == b:
       a = a+1
   elif a < b:
       b = b-1
       if b > a: a = a-1
       # end if
   else:
       print 'oops!'
   # end if
# end def foobar

Gdzie oryginał myfile.pybył:

def foobar(a, b):
   if a == b:
       a = a+1
   elif a < b:
       b = b-1
       if b > a: a = a-1
   else:
       print 'oops!'

Możesz również użyć pindent.py -rdo wstawienia prawidłowego wcięcia na podstawie komentarzy (przeczytaj nagłówek pindent.py po szczegóły), powinno to pozwolić ci kodować w Pythonie bez obawy o wcięcia.

Na przykład uruchomienie pindent.py -r myfile.pyspowoduje przekonwertowanie następującego kodu myfile.pyna ten sam odpowiednio wcięty (i opatrzony komentarzem) kod, który został wygenerowany w pindent.py -cpowyższym przykładzie:

def foobar(a, b):
if a == b:
a = a+1
elif a < b:
b = b-1
if b > a: a = a-1
# end if
else:
print 'oops!'
# end if
# end def foobar

Byłbym zainteresowany, aby dowiedzieć się, z jakiego rozwiązania korzystasz, jeśli potrzebujesz dalszej pomocy, skomentuj ten post, a postaram się pomóc.

Ryan
źródło
Głos przeciw: może to pomóc w czytaniu kodu, ale nie pomaga w jego pisaniu. Python i podobne języki, które polegają wyłącznie na odstępach w celu przedstawienia zagnieżdżenia, są z natury zepsute, jeśli chodzi o dostępność dla niewidomych. Przydatne może być narzędzie, które wykonuje odwrotność pindentkodu z równo z lewej strony (preferowany schemat wcięć wielu ślepych programistów) . Bardziej przydatne byłoby - ale nie jako jajko wielkanocne. from __future__ import braces
David Hammen
1
@DavidHammen: Jest to narzędzie, które realizuje odwrotność pindent.py -c; to jest pindent.py -r. Ryan już to zauważył w swojej odpowiedzi, ale po prostu zredagowałem ją, aby dodać wyraźny przykład i utrudnić przeoczenie. (Poprawiłem również opcję wiersza poleceń, aby to zrobić: to -r, nie, -dpo prostu usuwa komentarze.)
Ilmari Karonen
11

Osobiście wątpię, że w tej chwili tak jest, ponieważ wielu miłośników Pythona uwielbia fakt, że Python jest w ten sposób, rozdzielany białymi spacjami.

Jednak nigdy nie myślałem o tym jako o problemie z dostępnością. Może jest to coś, co można przedstawić jako raport o błędzie do Pythona?

Zakładam jednak, że używasz tutaj czytnika ekranu do wyjścia? Więc zakładki wydają się wam „niewidoczne”? Z wyjściem w alfabecie Braille'a może być łatwiejszy do odczytania, ale doskonale rozumiem, jak zagmatwane może to być.

W rzeczywistości jest to dla mnie bardzo interesujące. Żałuję, że nie wiem wystarczająco dużo, aby móc napisać aplikację, która zrobi to za Ciebie.

Myślę, że na pewno jest to coś, dla czego umieszczę raport o błędzie, chyba że sam to zrobiłeś lub chcesz.

Edit: Poza tym, jak zauważył przez Johna Millikin Istnieje również PyBraces co może być dobrym rozwiązaniem dla Ciebie i może być możliwe, aby być posiekany razem zależy od twoich umiejętności kodowania się dokładnie, co trzeba (i mam nadzieję, że jeśli to przypadek , udostępniasz go innym osobom takim jak ty do użytku)

Edycja 2: Właśnie zgłosiłem to do modułu śledzenia błędów Pythona

Mez
źródło
9

Chociaż nie jestem ślepy, słyszałem dobre rzeczy o Emacspeak . Mają tryb Pythona od czasu wydania 8.0 w 1998 roku (wydaje się, że są w wersji 28.0!). Zdecydowanie warto to sprawdzić.

technomalogiczne
źródło
6

Powinieneś być w stanie skonfigurować swój edytor tak, aby mówił tabulatory i spacje - wiem, że w większości edytorów można wyświetlać białe znaki, więc gdzieś musi być opcja dostępności, aby je wypowiedzieć.

W przeciwnym razie jest pybraces , który został napisany jako praktyczny żart, ale może ci się przydać przy odrobinie pracy.

John Millikin
źródło
2
Musisz jednak pomyśleć o tym, że w pewnym momencie zapamiętanie, gdzie jesteś w bloku kodu zależnym od zakładek, będzie trudne. Szelki oznaczają konkretny znacznik początku i końca, podczas gdy w przypadku zakładek może to być mylące (mylę się z tym i widzę!)
Mez
6

Jeśli korzystasz z systemu Windows, zdecydowanie polecam zapoznać się z EdSharp z: http://empowermentzone.com/EdSharp.htm Obsługuje wszystkie wiodące czytniki ekranu systemu Windows, można go skonfigurować tak, aby mówił o poziomach wcięć kodu, lub ma wbudowane narzędzie o nazwie PyBrace, które może konwertować składnię nawiasów klamrowych do i ze składni nawiasów klamrowych, jeśli chcesz to zrobić, i obsługuje wszystkie rodzaje innych funkcji, których programiści oczekują od naszych edytorów tekstu. Używam go od lat do wszystkiego, od PHP po JavaScript, HTML i Python i uwielbiam to.

fastfinge
źródło
Używam go jako mojego głównego redaktora od około roku.
Jared
4

Doceniam twój problem, ale myślę, że zamiast problemu, który chcesz rozwiązać, określasz implementację. Zamiast konwertować na nawiasy klamrowe, co powiesz na sposób, w jaki czytnik zawartości ekranu będzie informował o poziomie wcięcia?

Na przykład niektórzy ludzie pracowali nad kolorowaniem składni vima, aby przedstawić poziomy wcięć w Pythonie. Być może zmodyfikowane kolorowanie składni mogłoby dać coś, co czytałby twój czytnik ekranu?

andy
źródło
„wcięcie poziomu 4” foo równa się nowemu słupkowi „wcięcie poziomu 3” To zagmatwane i konieczność śledzenia tego w umyśle jest dodatkowym obciążeniem.
Mez
1
Nie powinno wystarczyć „wcięcie poziomu N”, „in” vs. „out” lub „indent” vs. „dedent”. def foo (x): indent return x * 2 dedent
kaleissin
4

Wszystkie te odpowiedzi typu „nie, nie możesz” są naprawdę irytujące. Oczywiście, że możesz.

To hack, ale możesz to zrobić.

http://timhatch.com/projects/pybraces/

używa niestandardowego kodowania do konwersji nawiasów klamrowych na bloki z wcięciem przed przekazaniem tego interpreterowi.


Na marginesie i jako ktoś nowy w Pythonie - nie akceptuję argumentu stojącego za tym, że nawet nie pozwalam nawiasy klamrowe / ogólne ograniczniki bloków ... poza tym, że są to preferencje programistów Pythona. Przynajmniej nawiasy klamrowe nie zostaną przypadkowo zjedzone, jeśli wykonujesz jakieś automatyczne przetwarzanie kodu lub pracujesz w edytorze, który nie rozumie, że białe znaki są ważne. Jeśli generujesz kod automatycznie, nie musisz śledzić poziomów wcięć. Jeśli chcesz używać Pythona do tworzenia jednowierszowego tekstu w języku perl, jesteś automatycznie kaleką. Jeśli nic innego, po prostu jako zabezpieczenie. Co się stanie, jeśli twój 1000-liniowy program w Pythonie zostanie zjedzony wszystkie jego karty? Zamierzasz przejść linia po linii i dowiedzieć się, gdzie powinno być wcięcie?

Zapytanie o to niezmiennie spowoduje nieprzyjemną odpowiedź, taką jak „po prostu zrób” z __ przyszłości __ importuj nawiasy klamrowe ”,„ skonfiguruj poprawnie swoje IDE ”,„ i tak jest lepiej, więc przyzwyczaj się do tego ”...

Rozumiem ich rację, ale hej, gdybym chciał, mógłbym umieścić średnik po każdym wierszu. Więc nie rozumiem, dlaczego wszyscy są tak nieugięci w kwestii aparatu ortodontycznego. Jeśli potrzebujesz języka, aby zmusić Cię do prawidłowego wcięcia, to przede wszystkim nie robisz tego dobrze.

Tylko moje 2c - i tak będę używał szelek.

la11111
źródło
musisz otworzyć powłokę Pythona i wpisać: zaimportuj to
ThatAintWorking
1
Rzeczywiście, moja opinia została ukształtowana przez doświadczenie. Próbowałem znaleźć sposób, aby zmusić Pythona do dostosowania się do potrzeb jednego z moich projektów i byłem sfrustrowany, gdy stwierdziłem, że odmówił tego za pomocą jakichkolwiek środków perswazji. Podszedłem do tego z innej perspektywy i odkryłem, że Python jest piękną i wysoce kooperatywną platformą do pracy. Główna lekcja, której się nauczyłem, to to, że tanie hacki i komputery nie łączą się dobrze. Musiałem przeprowadzić dogłębne badanie algorytmów analizowania, ale wiedza, którą zdobyłem, jest tego warta. Nadal nie obchodzą mnie wcięcia / oddanie, ale je szanuję.
la11111
4

Przeszukując dostępne środowisko Python IDE, znalazłem to i postanowiłem odpowiedzieć. W systemie Windows z JAWS:

  1. Przejdź do Centrum ustawień, naciskając JawsKey+ 6(w rzędzie liczb nad literami) w swoim ulubionym edytorze tekstu. Jeśli JAWS zapyta o utworzenie nowego pliku konfiguracyjnego, zaakceptuj.
  2. W polu wyszukiwania wpisz „wcięcie”
  3. Wynik będzie tylko jeden: „Wypowiedz znaki wcięcia”. Włącz to.
  4. Cieszyć się!

Jedyne, co nas frustruje, to to, że nie możemy cieszyć się przykładami kodu na stronach internetowych (ponieważ wypowiadanie wcięć w przeglądarkach nie jest zbyt wygodne - generuje zbędną mowę).

Miłego kodowania od innego początkującego Pythona).

Andre Polykanine
źródło
3

Używam eclipse z rozszerzeniami pydev, ponieważ jest to IDE, z którym mam duże doświadczenie. Doceniam również inteligentne wcięcia, które oferuje do kodowania instrukcji, pętli itp. Skonfigurowałem skrypt pindent.py jako zewnętrzne narzędzie, które mogę uruchomić na obecnie skoncentrowanym module Pythona, co ułatwia mi życie, dzięki czemu mogę zobaczyć, co jest zamknięte gdzie bez konieczności ciągłego sprawdzania wcięć.

Jared
źródło
1

Istnieje wiele odpowiedzi wyjaśniających, jak to zrobić. Ale radziłbym nie wybierać tej trasy. Chociaż można użyć skryptu do wykonania konwersji, utrudniłoby to pracę nad projektem zespołowym.

Moją rekomendacją byłoby skonfigurowanie czytnika ekranu, aby ogłaszał karty. Nie jest to tak denerwujące, jak się wydaje, ponieważ powiedziałoby tylko „wcięcie 5”, a nie „zakładka, karta, karta, karta”. Co więcej, wcięcie będzie odczytywane tylko wtedy, gdy ulegnie zmianie, więc możesz przejść przez cały blok kodu bez usłyszenia poziomu wcięcia. W ten sposób słyszenie wcięcia nie jest bardziej gadatliwe niż słyszenie szelek.

Ponieważ nie wiem, jakiego systemu operacyjnego lub czytnika ekranu używasz, niestety nie mogę podać dokładnych kroków, aby to osiągnąć.

Saqib
źródło
0

Edsger Dijkstra użył if ~ fi i do ~ od w swoim "Guarded Command Language", te wydają się pochodzić z Algol68 . Było też kilka przykładowych bloków chronionych przez Pythona używanych w RosettaCode.org .

fi = od = yrt = end = lambda object: None;
class MyClass(object):
    def myfunction(self, arg1, arg2):
        for i in range(arg1) :# do
            if i > 5 :# then
                print i
            fi
        od # or end(i) #
    end(myfunction)
end(MyClass)

Zmieniony kod Pythona z białymi znakami może zostać jednoznacznie usunięty i zmieniony, jeśli użyje się chronionych bloków if / fi, do / od & try / yrt razem ze średnikami ";" rozdzielić oświadczenia. Doskonały do ​​jednoznacznych list czasopism lub wycinania / wklejania ze stron internetowych.

Powinno być wystarczająco łatwe napisanie krótkiego programu w Pythonie, który wstawi / usunie bloki ochronne i średniki.

NevilleDNZ
źródło