Gibt es eine Möglichkeit, Einrückungen in Python-Code in geschweifte Klammern umzuwandeln?


81

Ich bin ein völlig blinder Programmierer, der Python lernen möchte. Leider ist die Tatsache, dass Codeblöcke mit unterschiedlichen Einrückungsstufen dargestellt werden, ein großer Stolperstein. Ich habe mich gefragt, ob es Tools gibt, mit denen ich Code mit geschweiften Klammern oder einem anderen Codeblock-Trennzeichen schreiben und dieses Format dann in eine richtig eingerückte Darstellung konvertieren kann, die der Python-Interpreter verwenden kann.


Welches Betriebssystem verwenden Sie aus Neugier?
Ryan

4
Aber warum sind Leerzeichen und Zeilenumbrüche ein Problem? Ist es nicht möglich, dass der Textleser nicht druckbare Zeichen sagt?
E-Satis

2
Das scheint ein Rezept für eine Katastrophe zu sein - ich kenne nicht viele Leute, die vor jeder Zeile "Raum Raum Raum Raum Raum Raum Raum Raum def foo" hören möchten.
Javawizard

@javawizard es könnte funktionieren, indem "def foo Doppelpunkt, nächste Zeile, Erhöhung der Einrückung, ..." oder "Einrückungsstufe 0, def foo Doppelpunkt, nächste Zeile
Einrückungsstufe

@smoothdeveloper Absolut, und genau das stellt sich die Frage des Posters.
Javawizard

Antworten:


56

Es gibt eine Lösung für Ihr Problem, die mit Python selbst verteilt wird. pindent.pyEs befindet sich im Verzeichnis Tools \ Scripts in einer Windows-Installation (mein Pfad dazu ist C: \ Python25 \ Tools \ Scripts). Es sieht so aus, als müssten Sie es von svn.python.org abrufen, wenn Sie es ausführen Linux oder OSX.

Es fügt Kommentare hinzu, wenn Blöcke geschlossen werden, oder kann Code ordnungsgemäß einrücken, wenn Kommentare eingegeben werden. Hier ist ein Beispiel für den Code, den pindent mit dem Befehl ausgibt:

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

Wo das Original myfile.pywar:

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!'

Sie können auch pindent.py -rdie richtige Einrückung basierend auf Kommentaren einfügen (lesen Sie die Kopfzeile von pindent.py für Details). Dies sollte es Ihnen ermöglichen, in Python zu codieren, ohne sich um Einrückungen kümmern zu müssen.

Wenn Sie beispielsweise pindent.py -r myfile.pyausführen , wird der folgende Code in myfile.pydenselben ordnungsgemäß eingerückten (und auch kommentierten) Code konvertiert, der im pindent.py -cobigen Beispiel erstellt wurde:

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

Es würde mich interessieren, welche Lösung Sie letztendlich verwenden. Wenn Sie weitere Hilfe benötigen, kommentieren Sie diesen Beitrag und ich werde versuchen, Ihnen zu helfen.


Downvote: Dies kann beim Lesen von Code hilfreich sein, beim Schreiben jedoch nicht. Python und ähnliche Sprachen, die nur vom Abstand abhängen, um die Verschachtelung darzustellen, sind von Natur aus fehlerhaft, wenn es um die Zugänglichkeit für Blinde geht. Ein Werkzeug , das führt die Umkehrung der pindentauf flush-links - Code (die bevorzugte Vertiefung Schema vieler blinde Programmierer) könnte nützlich sein. Nützlicher wäre from __future__ import braces- aber nicht als Osterei.
David Hammen

1
@DavidHammen: Es gibt ein Tool, das die Umkehrung von ausführt pindent.py -c; es ist pindent.py -r. Ryan hat das bereits in ihrer Antwort bemerkt, aber ich habe es nur bearbeitet, um ein explizites Beispiel hinzuzufügen und es schwieriger zu machen, es zu übersehen. (Außerdem habe ich die Befehlszeilenoption korrigiert, um dies zu tun: Es ist -rnicht -ddas , was nur die Kommentare entfernt.)
Ilmari Karonen

11

Ich persönlich bezweifle, dass dies derzeit der Fall ist, da viele Python-Fans die Tatsache lieben, dass Python auf diese Weise durch Leerzeichen abgegrenzt ist.

Ich habe das jedoch nie als Zugänglichkeitsproblem angesehen. Vielleicht ist es etwas, das Python als Fehlerbericht vorgelegt werden kann?

Ich würde davon ausgehen, dass Sie hier jedoch einen Screenreader für die Ausgabe verwenden? Die Tabs scheinen Ihnen also "unsichtbar" zu sein? Mit einer Braille-Ausgabe ist es vielleicht einfacher zu lesen, aber ich kann genau verstehen, wie verwirrend dies sein kann.

In der Tat ist das für mich sehr interessant. Ich wünschte, ich wüsste genug, um eine App schreiben zu können, die dies für Sie erledigt.

Ich denke, es ist definitiv etwas, für das ich einen Fehlerbericht erstellen werde, es sei denn, Sie haben dies bereits selbst getan oder möchten es.

Bearbeiten: Wie von John Millikin bemerkt, gibt es auch PyBraces, die eine praktikable Lösung für Sie sein könnten und abhängig von Ihren Codierungsfähigkeiten möglicherweise zusammen gehackt werden können, um genau das zu sein, was Sie brauchen (und ich hoffe, dass dies der Fall ist , Sie geben es für andere wie Sie frei, um es zu verwenden)

Edit 2: Ich habe dies gerade dem Python Bug Tracker gemeldet



6

Sie sollten in der Lage sein, Ihren Editor so zu konfigurieren, dass die Tabulatoren und Leerzeichen gesprochen werden. Ich weiß, dass in den meisten Editoren Leerzeichen angezeigt werden können. Daher muss irgendwo eine Eingabehilfenoption vorhanden sein, um sie zu sprechen.

Gelingt dies nicht, gibt es Pybraces , die als praktischer Witz geschrieben wurden, aber für Sie mit ein wenig Arbeit nützlich sein könnten.


2
Sie müssen jedoch daran denken, dass es zu einem bestimmten Zeitpunkt schwierig sein wird, sich daran zu erinnern, wo Sie sich in einem von Registerkarten abhängigen Codeblock befinden. Klammern markieren eine bestimmte Start- und Endmarkierung, während sie bei Tabulatoren verwirrend sein können (ich werde damit verwechselt und bin gesichtet!)
Mez

6

Wenn Sie unter Windows arbeiten, empfehle ich Ihnen dringend, sich EdSharp unter folgender Adresse anzusehen: http://empowermentzone.com/EdSharp.htm Es unterstützt alle führenden Windows-Bildschirmleser und kann so konfiguriert werden, dass es die Einrückungsstufen von Code spricht. oder es verfügt über ein integriertes Dienstprogramm namens PyBrace, das in und aus der Klammernsyntax konvertiert werden kann, wenn Sie dies stattdessen möchten, und es unterstützt alle Arten von anderen Funktionen, die Programmierer in unseren Texteditoren erwarten. Ich benutze es seit Jahren für alles, von PHP über JavaScript über HTML bis hin zu Python, und ich liebe es.


Ich benutze es seit ungefähr einem Jahr als Haupteditor.
Jared

4

Ich schätze Ihr Problem, denke aber, dass Sie die Implementierung anstelle des Problems angeben, das Sie lösen müssen. Anstatt in geschweifte Klammern zu konvertieren, können Sie daran arbeiten, wie Ihr Bildschirmleser Ihnen die Einrückungsstufe anzeigt.

Zum Beispiel, einige Leute haben sich auf vim Syntax gearbeitet Färbung Python Einrückungen darzustellen. Vielleicht könnte eine modifizierte Syntaxfarbe etwas erzeugen, das Ihr Bildschirmleser lesen würde?


"Level 4 Einrückung" foo entspricht neuem Balken "Level 3 Einrückung" Es ist verwirrend, und es ist eine zusätzliche Belastung, dies im Kopf zu behalten.
Mez

1
Nicht "Einrückung der Stufe N", "Ein" gegen "Aus" oder "Einzug" gegen "Dedent" sollte ausreichen. def foo (x): indent return x * 2 dedent
kaleissin

4

Alle diese "Nein, du kannst nicht" -Antworten sind wirklich ärgerlich. Natürlich kannst du.

Es ist ein Hack, aber du kannst es schaffen.

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

Verwendet eine benutzerdefinierte Codierung, um geschweifte Klammern in eingerückte Blöcke zu konvertieren, bevor sie an den Interpreter übergeben werden.


Als Nebenwirkung , und als jemand neu in Python - Ich akzeptiere nicht die Gründe nicht einmal erlaubt Zahnspange / generic Blockabgrenzern ... abgesehen davon , dass sein die Präferenz des Python Devs. Klammern werden zumindest nicht versehentlich gegessen, wenn Sie Ihren Code automatisch verarbeiten oder in einem Editor arbeiten, der nicht versteht, dass Leerzeichen wichtig sind. Wenn Sie Code automatisch generieren, ist es praktisch, die Einrückungsstufen nicht verfolgen zu müssen. Wenn Sie Python verwenden möchten, um einen perlartigen Einzeiler zu erstellen, werden Sie automatisch verkrüppelt. Wenn nichts anderes, nur als Schutz. Was ist, wenn Ihr 1000-Zeilen-Python-Programm alle Tabs verzehrt bekommt? Sie werden Zeile für Zeile gehen und herausfinden, wo die Einrückung sein sollte?

Wenn Sie danach fragen, erhalten Sie ausnahmslos eine ironische Antwort wie "Einfach aus __ zukünftigen __ Klammern importieren", "IDE richtig konfigurieren", "Es ist sowieso besser, also gewöhnen Sie sich daran" ...

Ich verstehe ihren Punkt, aber hey, wenn ich wollte, könnte ich nach jeder einzelnen Zeile ein Semikolon setzen. Ich verstehe also nicht, warum alle so unerbittlich mit der Zahnspange umgehen. Wenn Sie Ihre Sprache benötigen, um sich zum richtigen Einrücken zu zwingen, machen Sie es überhaupt nicht richtig.

Nur mein 2c - ich werde sowieso Zahnspangen verwenden.


Sie müssen eine Python-Shell öffnen und eingeben: import this
ThatAintWorking

1
In der Tat wurde meine Meinung durch Erfahrung beeinflusst. Ich habe versucht, einen Weg zu finden, um Python zu zwingen, sich an die Bedürfnisse eines meiner Projekte anzupassen, und war frustriert, dass es sich aus Überzeugungsgründen geweigert hat, dies zu tun. Ich bin aus einem anderen Blickwinkel darauf gekommen und habe festgestellt, dass Python eine schöne und äußerst kooperative Plattform ist, auf der man arbeiten kann. Die wichtigste Lektion, die ich gelernt habe, ist, dass billige Hacks und Computer nicht gut zusammenpassen. Ich musste mich eingehend mit Parsing-Algorithmen befassen, aber das gewonnene Wissen ist es wert. Ich mag Einrückungen / Dedents immer noch nicht, aber ich respektiere sie.
la11111

4

Durchsuchte eine zugängliche Python-IDE, fand diese und entschied sich zu antworten. Unter Windows mit JAWS:

  1. Gehen Sie zum Einstellungscenter, indem Sie in Ihrem bevorzugten Texteditor JawsKey+ 6(in der Zahlenreihe über den Buchstaben) drücken . Wenn JAWS zum Erstellen einer neuen Konfigurationsdatei auffordert, stimmen Sie zu.
  2. Geben Sie im Suchfeld "Einzug" ein.
  3. Es wird nur ein Ergebnis geben: "Einrückungszeichen sagen". Schalten Sie dies ein.
  4. Genießen!

Das einzige, was für uns frustrierend ist, ist, dass wir keine Codebeispiele auf Websites genießen können (da das Sprechen mit Gedankenstrichen in Browsern nicht allzu komfortabel ist - es erzeugt überflüssige Sprache).

Viel Spaß beim Codieren von einem anderen Python-Anfänger.


3

Ich verwende Eclipse mit den Pydev-Erweiterungen, da es sich um eine IDE handelt, mit der ich viel Erfahrung habe. Ich schätze auch die intelligente Einrückung, die es zum Codieren von Anweisungen, Schleifen usw. bietet. Ich habe das Skript pindent.py als externes Tool konfiguriert, das ich auf dem aktuell fokussierten Python-Modul ausführen kann, das mir das Leben erleichtert, damit ich sehen kann, was es ist geschlossen, ohne ständig die Einrückung überprüfen zu müssen.


1

Es gibt verschiedene Antworten, die erklären, wie das geht. Aber ich würde empfehlen, diesen Weg nicht zu nehmen. Sie könnten zwar ein Skript für die Konvertierung verwenden, es würde jedoch die Arbeit an einem Teamprojekt erschweren.

Meine Empfehlung wäre, Ihren Bildschirmleser so zu konfigurieren, dass die Registerkarten angekündigt werden. Dies ist nicht so ärgerlich, wie es sich anhört, da nur "Einzug 5" statt "Tab Tab Tab Tab Tab" angezeigt wird. Darüber hinaus wird die Einrückung nur gelesen, wenn sie sich ändert, sodass Sie einen ganzen Codeblock durchlaufen können, ohne die Einrückungsstufe zu hören. Auf diese Weise ist das Hören der Einrückung nicht ausführlicher als das Hören der Klammern.

Da ich nicht weiß, welches Betriebssystem oder welchen Bildschirmleser Sie verwenden, kann ich leider nicht die genauen Schritte angeben, um dies zu erreichen.


0

Edsger Dijkstra verwendete if ~ fi und do ~ od in seiner "Guarded Command Language", diese scheinen aus dem Algol68 zu stammen . Es gab auch einige Beispiele für Python-geschützte Blöcke, die in RosettaCode.org verwendet wurden .

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)

Durch Leerzeichen verstümmelter Python-Code kann eindeutig entwirrt und neu eingerückt werden, wenn geschützte Blöcke verwendet werden, wenn / fi, do / od & try / yrt zusammen mit Semikolons ";" Aussagen zu trennen. Hervorragend geeignet für eindeutige Zeitschriftenauflistungen oder zum Ausschneiden / Einfügen von Webseiten.

Es sollte einfach genug sein, ein kurzes Python-Programm zu schreiben, um die Schutzblöcke und Semikolons einzufügen / zu entfernen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.