Weil die Zeilen ab
label2 = ...
nicht eingerückt sind und das vorherige "if" damit schon zuende ist. Das
"else" ist damit herrenlos.
Da schlägt der einzige echte Schwachpunkt von Python mal wieder zu. Ein
unsichtbares Zeichen als funktionsrelevantes Syntaxelement zu verwendet,
ist einfach keine gute Idee
Vancouver schrieb:> Ein> unsichtbares Zeichen als funktionsrelevantes Syntaxelement zu verwendet,> ist einfach keine gute Idee
Da bin ich anderer Meinung.
Bei C hätte man ewig gebraucht um bei ähnlicher Fehlermeldung die
Klammern zu zählen.
Hier bei Python erkennt man den Anfängerfehler sofort...
OP sollte sich mal die Anfänger Tutorials zu Python anschauen, Copy &
Paste funktioniert schon bei einfachen Problemen nicht mehr.
Jim M. schrieb:> Vancouver schrieb:>> Ein>> unsichtbares Zeichen als funktionsrelevantes Syntaxelement zu verwendet,>> ist einfach keine gute Idee>> Da bin ich anderer Meinung.
Aber ich (und jeder erfahrene Programmierer) sieht das genau so wie
Vancouver. Und allein schon das konkrete Beispiel zeigt nur zu deutlich,
dass all diese erfahrenen Leute völlig richtig liegen...
Falls dir das nicht selber aufgefallen ist ist...
Jim M. schrieb:> Bei C hätte man ewig gebraucht um bei ähnlicher Fehlermeldung die> Klammern zu zählen.
Jeder anständige Editor unterstützt dich bei dieser "unmöglichen"
Aufgabe. Ob du nur eine Syntaxhervorhebung willst, einen Marker, der die
falsche Klammerung anzeigt, oder die schließende Klammer gleich
automatisch mit der öffnenden Klammer eingefügt werden soll, ist
Geschmackssache.
Nur gilt das eben auch für die Einrückung in Python: Jeden vernünftigen
Editor kann man so einstellen, dass das oben geschilderte Ergebnis nicht
versehentlich entsteht.
Und natürlich sind nicht nur die Zeilen ab label2 = ... falsch
eingerückt, sondern bereits die Zeilen ab if ..., denn offensichtlich
gehört das alles doch zur Methode "aktion" und braucht daher 4
zusätzliche Einrückungsebenen.
kev_g, nochmal ein Versuch: Mach ein paar Schritte zurück und eigne dir
die Grundlagen von Python an. Du bleibst sonst dauerhaft an solchen
Kleinigkeiten hängen.
Kev G. schrieb:> IndentationError: unexpected indent
Das ist aber der typische Fehler, bei gemischten Tabs + 4-er-spaces.
Mache einfach mal ein suchen-ersetzen mit regex zu \t
Hab ich auch schon ^^
Das interessant ist wenn ich alles einrücke dann kommt der Fehler
nichtmehr aber es bildet sich dann logischerweise ein Teufelskreis an
Fehlern
Ok, und wie sieht der Code mit dem "Teufelskreis" aus? Kannst du den
bitte als Datei anhängen, nicht in einen Beitrag einkopieren, damit die
Einrückungen ganz sicher exakt so erhalten bleiben, wie sie bei dir
waren?
Also die Einrückung passt auf jeden Fall dass würde man sonst ja sehen
an der Linie links neben dem Code..
wenn ich jetzt das einrücke so wies es dem programm lieb ist kommt dass
ich sell und jenes einrücken muss... zuerst quasi die zeilen die unter
label2 stehen alle, dann logischerweise else:invalid syntax
hab die datei angehängt
Kev G. schrieb:> Also die Einrückung passt auf jeden Fall
... nicht. :)
Das ganze Zeug ab if geloescht muss eine zusätzliche Ebene eingerückt
werden. Ich würde vermuten, dass ab fenster = Tk() gar nicht mehr
eingerückt wird.
Das ist das Ding denn wenn ich das mache schließt sich der Kreis undzwar
kommt dann das hier:
label2.pack(expand=1)
^
IndentationError: unexpected indent
Übrigens DANKE für die Hilfe ich weiß ich bin noch ein Anfänger aber ich
habe das Programm fast fertig und wills einfach hinbekommen ^^´
Vancouver schrieb:> Ein> unsichtbares Zeichen als funktionsrelevantes Syntaxelement zu verwendet,> ist einfach keine gute Idee
und dann
MaWIn schrieb:> Tab und space gemischt?MaWIn schrieb:> typische Fehler, bei gemischten Tabs + 4-er-spacesJens G. schrieb:> das liegt an den vielen Spaces in den Leerzeilen
Ich bin dann mal bei Vancouver ;-)
Python ist halt nur ein halbfertiger Entwicklungsschritt. Zum Ziel
gebracht haben es dann 2002 Brady und Morris mit der Entwicklung von
Whitespace. Da muss man sich nicht mehr mit so willkürlichen und
kryptischen Zeichen wie zum Beispiel Buchstaben und Zahlen rumschlagen.
Und man wird von Anfang an zu Sorgfalt, nicht nur im Hinblick auf
Einrückung, erzogen, weil Fehler schwer finden sind.
Dussel schrieb:> Python ist halt nur ein halbfertiger Entwicklungsschritt.> ...> Da muss man sich nicht mehr mit so willkürlichen und> kryptischen Zeichen wie zum Beispiel Buchstaben und Zahlen rumschlagen.> Und man wird von Anfang an zu Sorgfalt, nicht nur im Hinblick auf> Einrückung, erzogen, weil Fehler schwer finden sind.
Und nicht vergessen: Python ist eine unbedeutende Sprache und findet
seit nunmehr 30 Jahren keinen Anklang in der Entwicklergemeinde.
https://www.heise.de/developer/meldung/Python-schreibt-Geschichte-Platz-2-im-Programmiersprachen-Ranking-4673726.html
Kev G. schrieb:> from tkinter import *>> class Verkaufen(Button):> def verkaufen (self):> class MyButton (Button):
Was wird das denn für ein Unsinn? Eine Klasse, die von Button erbt, mit
einer Methode, in der eine weitere Klasse deklariert wird, die ebenfalls
von Button erbt? Was soll das werden?
> f = open('C:\dateien\sortiment.txt', 'r')> liste = f.readlines()> f.close()
1
with open('C:\dateien\sortiment.txt', 'r') as ifh:
2
liste = ifh.readlines()
> if geloescht:> fenster2 = Tk()> [...]> label2 = Label(rahmen2, text="Auto aus dem Sortiment entfernt!")> [...]> fenster2.mainloop()>> ####Zeile39####> else:
Einrückung!
> fenster2 = Tk()> [...]> fenster = Tk()
Drei Root-Fenster? Rly? Wozu gibt es eigentlich die Klasse
tkinter.Toplevel?
Kev, ehrlich: Dein Code ist so wirr, daß ich nicht einmal ansatzweise
erkennen kann, was er eigentlich tun soll. Anscheinend irgendwas mit
Autos, danach verlassen mich die Geister. BITTE hör' auf, Dich an
irgendwelchen GUI-Programmen zu versuchen, bevor Du die absoluten
Grundlagen verstanden hast. Einen Fahranfänger schickt man ja auch nicht
in der ersten Fahrstunde zur Hauptverkehrszeit in einem doppelstäckigen
Bus über den Trafalgar Square.
Wenn Du die Grundlagen verstanden hast -- und zwar zu allererst
angefangen mit der Syntax -- kannst Du Dich an die Grundlagen der
Objektorientierung begeben. Nicht umgekehrt. Hier [1] hat Sheeva mal ein
paar Grundlagen der OOP beschrieben und die Rationale erläutert, aber
auch das liest Du bitte erst, wenn Du die Grundlagen -- Syntax, Scope,
Datentypen, Funktionen, Schleifen, Verzweigungen und diese Dinge --
verstanden hast und sicher (!) beherrschst. Ansonsten tätest Du gut
daran, mal die anderen Ratschläge zu befolgen, die Sheeva Dir ganz
persönlich gegeben hat: [2] und [3]. Ansonsten wird das nämlich nie was,
trust me on this one.
[1] https://en.mikrocontroller.net/topic/512152#6572922
[2] Beitrag "Re: Frame wird nicht erkannt (Python3.0)"
[3] Beitrag "Re: Variable nicht definiert"
c-hater schrieb:> Aber ich (und jeder erfahrene Programmierer) sieht das genau so wie> Vancouver.
Das ist erstens falsch -- sonst wäre Python nicht mittlerweile die
nachweislich verbreitetste und beliebteste Skriptsprache der Welt -- und
zweitens ein argumentum ad populum, einer seriösen Diskussion also
ohnehin unwürdig. Und das ausgerechnet Du von einem erfahrenen
Programmierer weit entfernt bist, sieht ein kluger Leser ja schon an dem
Nickname, den Du Dir gegeben hast.
Jemand schrieb:> wäre Python nicht mittlerweile die> nachweislich verbreitetste und beliebteste Skriptsprache der Welt
TikTok ist auch weit verbreitet. Und braucht s einer?
MaWin schrieb:> Es ist ja in dem Scope, wo du es abfragst, auch nicht definiert.> Nimm dir ein Python-Buch und lies es.
Und die nächste Abhängigkeit vom unsichtbaren Zeichen. :-<
Ich habe es jetzt geschafft dass das Fenster auftaucht bzw es
funktioniert
Danke an alle die geholfen haben
Dennoch passiert nicht genau was passieren sollte also mein BUtton ist
sinnlos bzw macht nichits
Kev G. schrieb:> Dennoch passiert nicht genau was passieren sollte also mein BUtton ist> sinnlos bzw macht nichits
Lieber Kev, ich habe Dir ja bei Deinen letzten Threads schon konstruktiv
zu helfen versucht. Aber ich befürchte, Du müßtest schon ein bisschen
mitarbeiten, wenn das funktionieren soll.
Wie dem auch sei: wenn das, was Du da oben gecodet hast, auch nur
ansatzweise so in Deinem Buch steht, dann solltest Du es zum Feuermachen
benutzen, vorzugsweise unter dem Gesäß seines Autors. Bitte den
Brandbeschleuniger nicht vergessen!
Leider muß ich mich auch diesem "Jemand" [1] anschließen und sagen, daß
ich nicht im Ansatz verstehe, was Dein Code tun soll -- und daß Dir
leider offensichtlich verschiedene Grundlagen fehlen, die ein gutes Buch
Dir bereits längst vermittelt haben sollte.
Deswegen neige ich zu drei Vermutungen, und weiß noch nicht, welche
zutrifft:
1.) Dein Buch ist Mist. Das kann gut sein, seriöse Lektüre fängt
ungefähr beim Doppelten des Preises und beim Dreifachen des Umfangs der
Bücher des Autors an.
2.) Du hast das Buch zwar gelesen, aber nicht verstanden, was wiederum
entweder der Qualität des Buches, oder Deinem Mangel an Vorkenntnis
geschuldet sein kann.
3.) Du möchtest das Buch im Grunde nicht lesen und die Sprache nicht
verstehen, sondern einfach nur irgendwas GUI-Ähnliches zusammenbasteln,
ohne ein tieferes Verständnis für die Technik zu erlangen.
Wenn 1 und / oder 2 zutreffen, habe ich Dir bereits in einem anderen
Deiner Threads eine bessere Lektüre empfohlen. Arbeite sie durch, spiele
herum und schreibe erstmal ein paar Kommandozeilenprogramme, ganz
klassisch. NICHT mit GUI-Programmen anfangen, sondern erstmal das
Grundsätzliche lernen -- und dann bist Du mir auch weiterhin herzlich
willkommen.
Wenn 3 zutreffen sollte, dann kann ich Dir auch nicht helfen. Und, ganz
ehrlich und unter uns: dann will ich das auch nicht. Meine Zeit ist
leider begrenzt, und hier gibt es genug Leute, die etwas lernen und
verstehen wollen, und denen ich gerne mit Rat und Tat zur Seite stehe --
insofern wünsche ich Dir in diesem Fall viel Glück und einen schönen
Tag.
Als Anschauungsmaterial habe ich Dir allerdings noch ein kleines
Beispiel an diesen Beitrag angehängt, um Dir zu zeigen, wie elegant und
lesbar sauberer Python-Tkinter-Code aussehen kann. Vergleiche das mal
mit Deinem Code...
[1] Beitrag "Re: else: invalid syntax"
@kev:
Diese Zwangseinrückerei treibt mich bei Python auch regelmäßig in den
Wahnsinn. Ich habe mir anfangs angewöhnt, jede Struktur mit einem
Kommentar abzuschließen, z.B.
1
def aktion(self):
2
geloescht = False
3
if geloescht:
4
do_something()
5
# end if
6
# end aktion()
Alles zwischen "def" und "# end aktion()" muss um eine weitere Ebene
eingerückt sein. Das gleiche beim if-Statement. Damit siehst du dann
auch geich, wo in deinem Codeschnipsel der Fehler liegt.
Das ist zwar mehr Schreibarbeit, ist aber so hilfreich, dass ich es bis
heute mache (nun ja, zumindest meistens...). Das hat außerdem den
Vorteil, dass du bei langen Statements, die nicht in das Editorfenster
passen, auf einen Blick siehst, welches Statement wo zuende ist.
Vancouver schrieb:> Diese Zwangseinrückerei treibt mich bei Python auch regelmäßig in den> Wahnsinn.
Mich treibt nur in der Wahnsinn, wenn Leute in Sprachen nicht richtig
einrücken, wenn die Sprachen es nicht erzwingen.
Das ist einfach nur unlesbar. Klammern hin oder her.
MaWin schrieb:> So ein Bullshit.> Mit Klammern wäre das Ergebnis exakt gleich.
Nö, in jeder halbswegs aktuellen IDE lassen sich die zusammen gehörigen
Klammern markern.
Sorry, aber wenn ein Block durch nicht sichtbare Zeichen geknnzeichnet
ist un dann noch zwischen Space und Tab unterschieden wird, besch ...
geht s kaum.
hidden symbol schrieb:> Nö, in jeder halbswegs aktuellen IDE lassen sich die zusammen gehörigen> Klammern markern.
Genau wie man in jedem Editor, nicht nur in "halbwegs aktuellen IDEs",
die Zusammengehörigkeit eindeutig an der Einrückung erkennen kann.
> Sorry, aber wenn ein Block durch nicht sichtbare Zeichen geknnzeichnet
Seit wann ist eine Einrückung unsichtbar?
> ist un dann noch zwischen Space und Tab unterschieden wird, besch ...> geht s kaum.
Tja. Dass Tab erlaubt sind, ist in der Tat nicht ganz glücklich, weil
die Breite von der Umgebung abhängt.
Aber das ist jetzt halt so und es ist auch nicht mehr änderbar.
Du kannst ja einfach keine Tabs verwenden. Problem gelöst.
Formatierung dient der Formatierung, die Syntanx beschreibt die
'Sprache'. Denke an die Konvertierungsprobleme CR und CR/LF auf
unterschiedlichen Systemen.
Die nächste Spracherweiterung wird dann grüne und blaue Zeichen
unterscheiden. :-(
MaWin schrieb:> Dass Tab erlaubt sind, ist in der Tat nicht ganz glücklich, weil> die Breite von der Umgebung abhängt.> Aber das ist jetzt halt so und es ist auch nicht mehr änderbar.
Und damit eine Sch...lösung. Da sind wir uns ja einig. ;->
Ich kann im Code des TE keinen einzigen Tab entdecken. Daran kann es
also nicht liegen, dass seine Einrückungen nicht stimmen.
IMHO liegt es vielmehr daran, dass er die Strukturierung des Codes in
Blöcke noch nicht verstanden hat. In einer Sprache mit Klammern hätte er
somit genau die gleichen Probleme, weil er die Klammern an die falschen
Stellen setzen würde.
Threads zum Einrückungskonzept von Python und zum Thema Tabs vs Spaces
gibt es hier übrigens schon zur Genüge. Das Diese Themen müssen deswegen
nicht bei jeder unpassenden Gelegenheit wieder aufgefrischt werden.
hidden symbol schrieb:> Formatierung dient der Formatierung, die Syntanx beschreibt die> 'Sprache'.
Bei Python ist das halt nicht so. Ob du es magst, oder nicht.
Wenn die Formatierung bereits eindeutig die Blöcke definiert, warum
sollte ich zusätzlich noch Klammern verlangen?
> Denke an die Konvertierungsprobleme CR und CR/LF auf> unterschiedlichen Systemen.
Und das hat jetzt genau was mit Python zu tun?
MaWin schrieb:> Bei Python ist das halt nicht so. Ob du es magst, oder nicht.> Wenn die Formatierung bereits eindeutig die Blöcke definiert, warum> sollte ich zusätzlich noch Klammern verlangen?
Danke für die Bestätigung, dass Formatierung und Syntax bei Python
vermischt werden. Dann warte ich mal auf die grünen und blauen Zeichen
und welche besonderen Spracheigenschaften ihnen zugedacht werden. :-<<<
hidden symbol schrieb:> Danke für die Bestätigung, dass Formatierung und Syntax bei Python> vermischt werden.
Ähm, ja. Ok.
Niemand hat jemals in Frage gestellt, dass das so ist.
> Dann warte ich mal auf die grünen und blauen Zeichen> und welche besonderen Spracheigenschaften ihnen zugedacht werden.
Wo gibt es Pläne solcherlei Dinge zu implementieren?
hidden symbol schrieb:> Dann warte ich mal auf die grünen und blauen> Zeichen und welche besonderen Spracheigenschaften> ihnen zugedacht werden. :-<<<
ColorForth ist bekannt?
MaWin schrieb:> Wenn die Formatierung bereits eindeutig die Blöcke> definiert, warum sollte ich zusätzlich noch Klammern> verlangen?
Gegenfrage: Wenn sich die Formatierung automatisch
aus der Klammersetzung ableiten lässt -- warum sollte
ich dann den Quelltext noch von Hand formatieren?
Ist das die Vorstellung von "technischem Fortschritt":
Wir zwingen den Programmierer, etwas von Hand zu
machen, was die Maschine auch automatisch erledigen
könnte?
Und zur Frage "Wozu überhaupt Blockklammern?": Die
meisten natürlichen Sprachen kennen eine Interpunktion.
Es ist also wahrnehmungspsychologisch sinnvoll, das
bei formalen Sprachen beizubehalten. Texte ohne Kommas
und Satzzeichen sind beschissen lesbar.
Egon D. schrieb:> MaWin schrieb:>>> Wenn die Formatierung bereits eindeutig die Blöcke>> definiert, warum sollte ich zusätzlich noch Klammern>> verlangen?>> Gegenfrage: Wenn sich die Formatierung *automatisch*> aus der Klammersetzung ableiten lässt -- warum sollte> ich dann den Quelltext noch von Hand formatieren?>> Ist das die Vorstellung von "technischem Fortschritt":> Wir zwingen den Programmierer, etwas von Hand zu> machen, was die Maschine auch automatisch erledigen> könnte?
Den C program beautifier (cb) gab es schon vor mindestens 35 Jahren:
https://www.unix.com/man-page/v7/1/cb/
"DESCRIPTION
Cb places a copy of the C program from the standard input on
the standard output with spacing and indentation that displays the
structure of the program."
"4th Berkeley Distribution May 5, 1986"
Geben tut es das also schon viel länger als Python...
Wenn es keiner benutzt, ist das nicht die Schuld von Programmiersprachen
mit Klammern um Blöcke oder gar irgendein Zwang.
Nur für Python kann es einen solchen Beautifier nicht geben. Ich denke
das wäre sogar formal beweisbar, wenn man sich die Zeit nimmt.
hidden symbol schrieb:> MaWin schrieb:>> Bei Python ist das halt nicht so. Ob du es magst, oder nicht.>> Wenn die Formatierung bereits eindeutig die Blöcke definiert, warum>> sollte ich zusätzlich noch Klammern verlangen?>> Danke für die Bestätigung, dass Formatierung und Syntax bei Python> vermischt werden. Dann warte ich mal auf die grünen und blauen Zeichen> und welche besonderen Spracheigenschaften ihnen zugedacht werden. :-<<<
Ja, aber spätestens dann mußt Du Deinen bernsteinfarbenen
Monochrom-Monitor ausrangieren ...
Egon D. schrieb:> Gegenfrage: Wenn sich die Formatierung automatisch> aus der Klammersetzung ableiten lässt -- warum sollte> ich dann den Quelltext noch von Hand formatieren?
Richtig. Ich bin voll bei dir.
Den Programmierer die Einrückung und die Klammern machen zu lassen, ist
Unsinn.
Egon D. schrieb:> Und zur Frage "Wozu überhaupt Blockklammern?": Die> meisten natürlichen Sprachen kennen eine Interpunktion.> Es ist also wahrnehmungspsychologisch sinnvoll, das> bei formalen Sprachen beizubehalten.
Natürliche Sprachen kennen auch Einrückungen und Absätze.
MaWin schrieb:> Natürliche Sprachen kennen auch Einrückungen und Absätze.
Die sind für den Inhalt aber unwichtig. Wichtig sind aber Satzzeichen,
um Zusammengehörigkeit zu erkennen; Beziehung herzustellen und nicht
erraten zu lassen.
hidden symbol schrieb:> Die sind für den Inhalt aber unwichtig.
So ein Unsinn.
Sie sind wichtig um
> Zusammengehörigkeit zu erkennen
Und Gedichte hast du anscheinend auch noch nie gelesen.
Egon D. schrieb:> Gegenfrage: Wenn sich die Formatierung automatisch> aus der Klammersetzung ableiten lässt -- warum sollte> ich dann den Quelltext noch von Hand formatieren?>> Ist das die Vorstellung von "technischem Fortschritt":> Wir zwingen den Programmierer, etwas von Hand zu> machen, was die Maschine auch automatisch erledigen> könnte?
Python war ja als Lernsprache gedacht. Einrückung ist in (den meisten?)
Hochsprachen praktisch zwingend, auch wenn es syntaktisch ohne ginge.
Python will das erzwingen, um die Lernenden von Anfang an ans richtige
Einrücken zu gewöhnen. Diese Idee finde ich nicht schlecht. Dass Python
sich dann zu einer der Standardsprachen entwickelt hat, ist halt etwas
'blöd' gelaufen, aber so ist es halt.
Rein vom Gefühl her würde ich sagen, dass die meisten
Pythonprogrammierer Python trotz der syntaktischen Einrückung verwenden
und nicht deswegen.
MaWin schrieb:> So ein Unsinn.
Ich behaupte, einen Text auch ohne Aufteilung in Absätze lesen (und
verstehen) zu können. Ohne Satzzeichen wird es aber schwer und
uneindeutig; das führt zu Missverständnissen.
MaWin schrieb:> Und Gedichte hast du anscheinend auch noch nie gelesen.
???
Der Dichter ist völlig frei von irgendwelchen Regeln. Ich hoffe, das ist
nicht deine Vision für eine Programmiersprache. :-(
Nikolaus S. schrieb:> Den C program beautifier (cb) gab es schon vor> mindestens 35 Jahren: [...]
Ja, richtig. Ich weiss.
> Geben tut es das also schon viel länger als> Python...
Ja, eben.
Und was hat Guido van Rossum gemacht? Hat er den
(hypothetischen) "python beautifier" in den
Standard-Editor integriert? -- Nein! Er hat die
(in vielen Sprachen üblichen) Blockklammern
abgeschafft , um den Programmierer zum Einrücken
zu zwingen .
Ist das technischer Fortschritt?
MaWin schrieb:> Egon D. schrieb:>> Gegenfrage: Wenn sich die Formatierung automatisch>> aus der Klammersetzung ableiten lässt -- warum sollte>> ich dann den Quelltext noch von Hand formatieren?>> Richtig. Ich bin voll bei dir.
Das kann ich nicht glauben. Das hat es ja noch nie
gegeben :)
> Den Programmierer die Einrückung und die Klammern> machen zu lassen, ist Unsinn.
Ich bin nicht sicher, was Du damit sagen willst.
Ich meine jedenfalls, dass der fertige Quelltext
(idealerweise) sowohl Blockklammern als auch
Einrückungen enthalten sollte -- aber der
Programmierer sollte nur eins von beiden eingeben
müssen. Die Maschine sollte so schlau sein, das
andere automatisch zu ergänzen.
> Egon D. schrieb:>> Und zur Frage "Wozu überhaupt Blockklammern?":>> Die meisten natürlichen Sprachen kennen eine>> Interpunktion. Es ist also wahrnehmungspsychologisch>> sinnvoll, das bei formalen Sprachen beizubehalten.>> Natürliche Sprachen kennen auch Einrückungen und> Absätze.
Richtig -- deswegen bin ich dafür, dass der fertige
Quelltext beides enthält. Das unterscheidet mich
wohl von Guido van Rossum.
Im dritten Jahrtausend sollte es allerdings genügen,
wenn der Programmierer nur eins von beiden eingeben
muss -- die Maschine sollte das andere automatisch
ergänzen können.
hidden symbol schrieb:> MaWin schrieb:>> Natürliche Sprachen kennen auch Einrückungen und>> Absätze.>> Die sind für den Inhalt aber unwichtig.
Das ist übertrieben; die Welt ist nicht schwarzweiss.
> Wichtig sind aber Satzzeichen, um Zusammengehörigkeit> zu erkennen; Beziehung herzustellen und nicht erraten> zu lassen.
Sicher -- und Absätze, Überschriften und dergleichen
sind wichtig, um sich im Text zu orientieren. Das ist
bei Quelltexten nicht anders.
Egon D. schrieb:> Sicher -- und Absätze, Überschriften und dergleichen> sind wichtig, um sich im Text zu orientieren. Das ist> bei Quelltexten nicht anders.
Der Compiler muss sich nicht orientieren. Dem ist das völlig egal, so
lange die Syntax stimmt.
Es geht nicht um hübsch, sondern um erforderlich.
hidden symbol schrieb:> Es geht nicht um hübsch, sondern um erforderlich.
Nein, es geht um Lesbarkeit und Verständlichkeit. Sourcecode, der diese
Anforderungen nicht erfüllt, ist für die Tonne, egal wie gut er
funktioniert. Der Code wird von Programmierern geschrieben, debuggt und
weiterentwickelt, nicht vom Compiler. Daher steht die Notwendigkeit von
Einrückungen völlig außer Frage, in jeder Sprache, mit oder ohne
Klammern. Sonst kannst du wieder das Spaghetti-Basic aus den 80er
programmieren, gerne auch mit 10 Anweisungen in jeder Zeile. Dann sieht
dein Code aus wie ein Ziegelstein von der Seite.
Einrückungen sind aber ein Gestaltungselement, das die Lesbarkeit
verbessert. Nicht mehr und nicht weniger. Die Art und Weise, wie Python
den Programmierer dazu zwingt, verursacht immer wieder endlose
Reformatierungsläufe, spätestens wenn mal einen anderer Editor verwendet
wird. Oder man versehentlich Tabs statt Leerzeichen verwendet hat.
Dummerweise sehen die genau gleich aus, und man kann sich den Wolf
suchen, um die Stelle zu finden.
Vancouver schrieb:> Nein, es geht um Lesbarkeit und Verständlichkeit. Sourcecode, der diese> Anforderungen nicht erfüllt, ist für die Tonne, egal wie gut er> funktioniert.> Die Art und Weise, wie Python> den Programmierer dazu zwingt,
Also zwingt Python den Programmierer Code zu schreiben, der nicht für
die Tonne ist.
Ich halte das für eine gute Idee.
> verursacht immer wieder endlose> Reformatierungsläufe, spätestens wenn mal einen anderer Editor verwendet> wird. Oder man versehentlich Tabs statt Leerzeichen verwendet hat.> Dummerweise sehen die genau gleich aus, und man kann sich den Wolf> suchen, um die Stelle zu finden.
Ach komm.
Tabs ersetzen ist in vielen Editoren nur ein einziger Knopfdruck und in
allen anderen Editoren automatisiert durch Suchen-ersetzen.
Ich programmiere seit Ewigkeiten Python und habe noch nie irgendein
Problem mit Tabs vs. Spaces gehabt. Das ist einfach nur ein
daherfantasiertes Problem.
Python hat einen starken Fokus auf RAD und gute Lesbarkeit. Deswegen
wurde beim Entwurf der Sprache versucht, Redundanz möglichst zu
minimieren. Das äußert sich vor allem in der dynamischen Typisierung,
die ohne Variablendeklarationen auskommt, aber eben auch im Weglassen
von Blockklammern. Beides hat natürlich auch seine Nachteile, weswegen
oft Kritik daran laut wird. Für diejenigen, die statische Typisierung
und Blockklammern ein Muss sind, gibt es aber ja zum Glück genügend
Alternativen, bspw. C und C++, die beide auch noch weitere Vorteile
haben.
Ich persönlich empfinde Python-Code (zumindest wenn er von jemandem
geschrieben wurde, der die Python-Philosophie halbwegs verstanden hat)
als viel leichter lesbar als bspw. C oder C++. Das hängt ganz einfach
damit zusammen, dass in Python selbst komplexere Algorithmen sehr
kompakt und übersichtlich implementiert werden können, so dass sie oft
als Ganzes auf dem Bildschirm dargestellt werden können, während man in
C/C++ oft mehrmals hinauf- und hinabscrollen muss, bis man sich den
nötigen Überblick verschafft hat.
Die Knappheit von Python verbunden mit dessen Ausdrucksstärke führt aber
auch dazu, dass ich Programmcode in Python sehr viel schneller schreiben
kann als in C/C++.
Zu dieser Kompaktheit tragen – wenn auch nur zu einem Teil – auch die
fehlenden Blockklammern bei, die in C/C++ die je nach Einrückungsstil 1
oder sogar 2 zusätzliche Zeilen pro Klammerpaar benötigen. Schon das
alleine erhöht die Anzahl der Codezeilen bei der Verwendung vieler
Kontrollstrukturen schnell mal um 50%, was die Wahrscheinlichkeit, einen
komplexeren Codeabschnitt ohne Scrollen auf einen Blick erfassen zu
können, stark verringert.
Die von einigen immer wieder hochstilisierte Fehlerträchtigkeit der
Python-Einrückungen ist zwar existent, IMHO aber weitgehend harmlos.
Genauso oft (und nur sehr selten), wie ich Python falsch einrücke,
vergesse ich in C/C++ die Klammern oder setze sie an die falsche Stelle.
Sowohl in C/C++ als auch in Python wird man in vielen Fällen auf den
Fehler hingewiesen (wenn dadurch eine Syntaxregel gebrochen wird), in
den Fällen, wo dies nicht geschieht, finde den Fehler auch schnell
selber.
Mal Hand aufs Herz: Was war die längste Zeitdauer, in der ihr in Python
nach einem Fehler gesucht habt, der sich hinterher aus Einrückungsfehler
herausgestellt hat, und wie oft ist das euch schon passiert?
Für diejenigen, die Python nur wegen des Einrückkonzepts nicht mögen,
gibt es Lösungen:
https://github.com/mathialo/bythonhttps://python-with-braces.appspot.com/https://pypi.org/project/brackets/https://hackaday.com/2014/02/10/python-with-braces/
Es gibt noch einen anderen Ansatz (den ich im Netz leider gerade nicht
finde), bei dem die Klammern als #{ und #} (bzw. #begin und #end) in
Kommentare gestellt werden, so dass an der Syntax der Sprache selber
keinerlei Änderungen notwendig sind, d.h. der Code wie gewohnt ohne
Präprozessor o.ä. direkt ausgeführt werden kann.
Diese Kommentare können bspw. von einem Re-Indent-Tool, Editoren und
dergleichen genutzt werden. Es gibt dafür auch Tools zum automatischen
Einfügen dieser Klammern in existierenden (und bereits korrekt
eingerückten) Python-Code und zum automatischen Entfernen der Klammern.
Dies bietet bspw. die Möglichkeit, den Code beim Laden in den Editor zu
klammern und beim Abspeichern wieder zu entklammern, so dass in einer
Entwicklergruppe, in der nicht alle Mitglieder diese Klammern wollen,
diese dadurch nicht unnötig gestört werden.
Allzu populär scheinen die genannten Python-Erweiterungen aber nicht zu
sein, weswegen die Entwicklung einiger davon auch wieder eingestellt
wurde.
Diese schlechte Akzeptanz hat IMHO die folgenden Gründe:
- Die meisten Python-Nutzer finden das bestehende Einrückkonzept gut
oder stören sich zumindest nicht daran.
- Von denjenigen, die das Einrückkonzept laut kritisieren, haben
vermutlich viele eine generelle Abneigung gegen Python (bspw. wegen
der dynamischen Typisierung), weswegen sie Python auch dann nicht
nutzen würden, wenn es Blockklammern gäbe.
- Der Rest (also die Gruppe derjenigen, die Python ausschließlich wegen
des Einrückkonzepts ablehnen) ist vermutlich so klein, dass die
Entwicklung von Python-Erweiterungen wie den oben genannten kaum auf
fruchtbaren Boden fällt.
Um am Ende auch selber mal herbe Kritik an der Python-Syntax
loszuwerden:
Mich stören ganz gewaltig
- Die hässlichen Doppelpunkte am Ende jeder Zeile mit if, while, for,
def usw.: Diese Doppelpunkte widersprechen ganz klar dem Prinzip der
reduzierten Redundanz und könnten IMHO ohne irgendwelche Konflikte
beim Parsen ersatzlos aus der Syntaxdefinition gestrichen werden.
- Die Länge des Schlüsselworts "lambda": Lambda-Ausdrücke dienen ja u.a.
dazu, kompakte Funktionsdefinitionen innerhalb anderer Ausdrücke
(bspw. als Argumente in Funktionsaufrufen) zu definieren. In vielen
Fällen ist aber das Schlüsselwort zusammen mit dem nachfolgenden,
zwingend erforderlichen Leerzeichen länger als die eigentliche
Funktionsdefinition (bspw. in lambda x:x+1). IHMO sollte man "lambda"
einfach durch einen Backslash ersetzen. Das vorige Beispiel würde sich
damit auf \x:x+1 reduzieren. Auch das ließe sich ohne Parserkonflikte
ändern, da der Backslash ansonsten nur als Escape-Zeichen in
Stringliteralen und als Fortsetzungszeichen am Zeilenende verwendet
wird.
Da ich aber sonst mit Python mehr als zufrieden bin, mache ich deswegen
keinen großen Aufstand :)
Yalu X. schrieb:> Mich stören ganz gewaltig> [...]> Da ich aber sonst mit Python mehr als zufrieden bin, mache ich deswegen> keinen großen Aufstand :)
Ich könnte mir vorstellen, dass das bei vielen auch für die erzwungene
Einrückung gilt. Nur weil man sich nicht beschwert, heißt das nicht,
dass man sich nicht daran stört.
Ich denke, dazu gibt es keine Statistik, aber interessieren würde es
mich doch.
PS: Zeilenumbrüche in Zitaten scheinen nicht richtig zu funktionieren.
Die drei Punkte sollten in einer eigenen Zeile stehen.
Dussel schrieb:> PS: Zeilenumbrüche in Zitaten scheinen nicht richtig zu funktionieren.> Die drei Punkte sollten in einer eigenen Zeile stehen.
PS: Die Vorschau zeigt Zitate nicht so an, wie sie am Ende aussehen. In
der Vorschau war das ganze Zitat zusammengezogen.
hidden symbol schrieb:> Egon D. schrieb:>> Sicher -- und Absätze, Überschriften und dergleichen>> sind wichtig, um sich im Text zu orientieren. Das ist>> bei Quelltexten nicht anders.>> Der Compiler muss sich nicht orientieren.
???
Der Compiler nicht -- aber der Mensch . Quelltexte
werden öfter gelesen (auch vom Menschen) als
geschrieben.
> Es geht nicht um hübsch, sondern um erforderlich.
Für den Menschen ist anderes erforderlich als für
den Compiler. Für den Menschen ist "hübsch" sehr
wohl erforerlich.
Yalu X. schrieb:> Python hat einen starken Fokus auf RAD und gute> Lesbarkeit. Deswegen wurde beim Entwurf der Sprache> versucht, Redundanz möglichst zu minimieren.
Das "deswegen" ist meiner Meinung nach unzutreffend,
wenigstens was die Lesbarkeit angeht.
Die meisten natürlichen Sprachen enthalten ein
erhebliches Maß an Redundanz; nur deswegen
funktionieren sie im Alltag einigermaßen.
> Ich persönlich empfinde Python-Code (zumindest> wenn er von jemandem geschrieben wurde, der die> Python-Philosophie halbwegs verstanden hat) als> viel leichter lesbar als bspw. C oder C++. Das> hängt ganz einfach damit zusammen, dass in Python> selbst komplexere Algorithmen sehr kompakt und> übersichtlich implementiert werden können,
Ich denke, dass trifft auf zahlreiche halbwegs
aktuelle Scriptsprachen zu. Für Tcl würde ich es
zumindest unterschreiben.
> Zu dieser Kompaktheit tragen – wenn auch nur zu einem> Teil – auch die fehlenden Blockklammern bei, die in> C/C++ die je nach Einrückungsstil 1 oder sogar 2> zusätzliche Zeilen pro Klammerpaar benötigen. Schon> das alleine erhöht die Anzahl der Codezeilen [...]
Bei mir entsteht (Tcl-typisch) immer nur eine zusätzliche
Zeile (für die schließende Blockklammer), aber die stört
mich nicht.
In fast jeden (längeren) Quelltext füge ich sogar
zusätzliche Leerzeilen ein, um komplexere Operationen
auch optisch voneinander abzusetzen und mir die
Orientierung zu erleichtern. Fällt mir erst jetzt auf,
wo ich so darüber schreibe.
> Die von einigen immer wieder hochstilisierte> Fehlerträchtigkeit der Python-Einrückungen [...]
Da ich nicht in Python programmiere, kann ich zu Fehlern
beim SCHREIBEN des Codes nix sagen.
Mir fällt aber auf, dass meine Ladehemmung beim LESEN
von Python-Code viel höher ist als z.B. beim Lesen von
C-Code, obwohl ich auch in C Anfänger bin.
> - Von denjenigen, die das Einrückkonzept laut> kritisieren, haben vermutlich viele eine generelle> Abneigung gegen Python (bspw. wegen der dynamischen> Typisierung),
Tcl ist auch dynamisch typisiert; insofern ist das für
mich nicht relevant.
> - Die hässlichen Doppelpunkte am Ende jeder Zeile mit> if, while, for, def usw.: Diese Doppelpunkte> widersprechen ganz klar dem Prinzip der reduzierten> Redundanz
Die sind m.E. der halbherzige Ersatz für die Blockklammern.
Doppelpunkt ist auf einer Tastatur mit deutscher Belegung
deutlich besser erreichbar als die geschweifte Klammer...
MaWin schrieb:> Ich halte das für eine gute Idee.
Ich halte es für eine bessere Idee, alle nicht-funktionalen Aspekte des
Sourcecodes der Disziplin des Programmierers zu überlassen. Dazu gibt es
Styleguides, die jede Menge Empfehlungen enthalten, auch zum Thema
Indents. Wer guten Code schreibt, muss sich ohnehin an einen Styleguide
halten. Da gehört nämlich noch mehr viel dazu als nur Einrückungen.
> Tabs ersetzen ist in vielen Editoren nur ein einziger Knopfdruck und in> allen anderen Editoren automatisiert durch Suchen-ersetzen.
Und in beiden Fällen zusätzliche Arbeit, die durch entsprechende Tags
vermieden werden könnte.
Yalu X. schrieb:> Die Knappheit von Python verbunden mit dessen Ausdrucksstärke führt aber> auch dazu, dass ich Programmcode in Python sehr viel schneller schreiben> kann als in C/C++.
Das liegt aber in erster Linie daran, dass in Python schon jede Menge
Strukturen vordefiniert sind, die man in anderen Sprachen erst selber
schreiben oder durch eine Library einbinden muss. Stichwort
Dictionaries, Listen, Tupel...
Yalu X. schrieb:> Mal Hand aufs Herz: Was war die längste Zeitdauer, in der ihr in Python> nach einem Fehler gesucht habt, der sich hinterher aus Einrückungsfehler> herausgestellt hat, und wie oft ist das euch schon passiert?
Ich hab nicht mit der Stoppuhr da gesessen, aber passiert ist es oft,
auch heute nach gut 15 Jahren Python passiert es noch. Besonders
ärgerlich wird es, wenn eine falsche Einrückung nicht zu einer
Fehlermeldung führt sondern nur zu einem falschen Verhalten. Man kann
nur den Kopf schütteln, wenn eine Zeile Code zu völlig anderen
Ergebnissen führt, wenn man sie vier Leerzeichen weiter einrückt.
Ich verbringe jedenfalls ganz sicher mehr Zeit in Python mit dem
Aufdröseln von Indents als mit der Korrektur von Klammern oder Tags in
anderen Sprachen.
Beispiel: Oft hat man am Ende einer C-Funktion eine ganze Kaskade von
schließenden Klammern. In Python steht da einfach - nichts. Wenn man nun
in dieses Nichts an der richtigen Stelle noch eine Zeile einfügen will,
muss man erstmal hochscrollen und schauen, wieviele Tabs und/oder
Leerzeichen die richtige Strukturebene hat. Das ist einfach nur
ärgerlich, zeitraubend und fehleranfällig. Klar gibt es Editoren, die
die Indent-Ebenen als Linien darstellen, das machts einfacher. Aber die
eigentliche Struktur muss dann eben erst durch Hilfsmittel sichtbar
gemacht werden. Das ist doch nicht der Sinn der Sache. Klammern sind da
unmissverständlich und eindeutig, in jedem Editor (sogar im vi).
Vancouver schrieb:> Beispiel: Oft hat man am Ende einer C-Funktion eine ganze Kaskade von> schließenden Klammern.
Ja, schrecklich.
> In Python steht da einfach - nichts.
Vollkommen ausreichend.
> Wenn man nun in dieses Nichts an der richtigen Stelle noch eine Zeile> einfügen will, muss man erstmal hochscrollen und schauen, wieviele Tabs> und/oder Leerzeichen die richtige Strukturebene hat.
Hochscrollen muss man doch sowieso, auch in C, um zu sehen, was in
welcher Ebene genau getan wird. Wenn ich nur das
1
x=1;
2
}
3
}
4
}
5
}
6
}
sehe, weiß ich doch nicht, wo ich die neue Zeile einfügen möchte, es sei
denn, ich habe den darüberliegenden Code im Kopf. Ist das tatsächlich
der Fall, dann weiß ich, dass ich – ausgehend von der letzten Codezeile
– bspw. 2 Einrückungsebenen nach links gehen muss. In C drücke ich dazu
zweimal auf Cursor-Down, in Python stattdessen zweimal auf Backspace
(Vim ist so eingestellt, dass Backspace auch Autoindents löscht), um an
die gewünschte Stelle zu gelangen. Wo ist da der große Unterschied?
Yalu X. schrieb:> Ja, schrecklich.
Schrecklich eineindeutig.
Yalu X. schrieb:> Vollkommen ausreichend.
Wenn man daran Spaß hat, sich den Rest zu denken.
Yalu X. schrieb:> Wo ist da der große Unterschied?
Hier:
1
bla()
2
bla()
3
bla()
4
blub()
Na, wieviele Einrückunsebenen liegen zwischen dem letzten bla() und dem
blub()? Eine? Zwei? Sieben?
Und jetzt das:
1
bla();
2
bla();
3
bla();
4
};
5
};
6
};
7
};
8
blub();
9
};
10
};
Da schau an, es waren vier. Wer hätte das gedacht. Und es gibt sogar
noch zwei danach.
Vancouver schrieb:> Na, wieviele Einrückunsebenen liegen zwischen dem letzten bla() und dem> blub()? Eine? Zwei? Sieben?> Und jetzt das: bla();> bla();> bla();> };> };> };> };> blub();> };> };>> Da schau an, es waren vier. Wer hätte das gedacht. Und es gibt sogar> noch zwei danach.
Die Frage ist doch ob mich die Zahl interessiert auf welcher Ebene ich
nun bin und wie viele Ebenen zwischen zwei Zeilen liegen oder ob mich
der Kontext interessiert zu welchem eine bestimmte Zeile gehört.
Ich kann mit deinem ersten Python-Codeblock genauso wenig anfangen wie
mit deinem C-Codeblock.
Mich interessiert nicht ob zwischen bla() und blub() vier ebenen liegen,
sondern was über blub() in der selben Ebene steht. Und da orientiere ich
mich an der Einrückung, egal ob in C oder Python.
Unf falls über blub() zu viel Code steht, so dass ich es nicht mehr
erkennen kann, klicke ich auf das (-) im Editor um bestimmte Blöcke
auszublenden.
Bei bis zu 4 oder 5 Ausrückungen erkennt man deren Anzahl noch ganz gut,
wenn man sich auf eine fixe Einrückungbreite (bspw. 2 oder 4 Spaces)
festgelegt hat und sich ein wenig daran gewöhnt hat. Bei einer
Einrückungstiefe von mehr als 5 Ebenen innerhalb einer Funktion sollte
man evtl. über seinen Programmierstil nachdenken.
In deinem ersten Beispiel hast du übrigens 9 Zeichen ausgerückt. Geht
man von einer Einrückungbreite von 2 Spaces (wie in deinem zweiten
Beispiel) aus, und ist der restliche Code korrekt eingerückt, würde
Python in der Zeile mit dem blub() meckern:
1
IndentationError: unindent does not match any outer indentation level
Man darf in tief verschachteltem Code die einzelnen Blöcke aber auch
gerne mit einem Kommentar abschließen. Dann erkennt man nicht nur,
dass ein Block abgeschlossen wird, sondern auch gleich welcher :
1
bla()
2
bla()
3
bla()
4
# end if
5
# end for z
6
# end for y
7
# end for x
8
blub()
Solche Kommentare sieht man auch mitunter in C-Code, weil in einer
Kolonne mehrerer schließender Klammern die einzelnen Klammern für sich
gesehen wenig aussagekräftig sind.
Yalu X. schrieb:> In deinem ersten Beispiel hast du übrigens 9 Zeichen ausgerückt
Ja, das war ja auch nur ein plakatives Beispiel, um zu zeigen, dass man
da nichts sehen kann. Ohne mit dem Cursor zu zählen, weißt du nicht,
wieviele Ebenen dazwichen liegen.
Dein Hinweis mit den Kommentaren ist genau das, was ich auch verwende in
Python, außer bei sehr kurzen Codestücken. Faktisch fügt man damit eben
die Klammern als Kommentar ein.
G. P. schrieb:> Die Frage ist doch ob mich die Zahl interessiert auf welcher Ebene ich> nun bin
Bei n-fach verschachtelten Schleifen oder if-Kaskaden weißt du nach n
Klammern, dass du wieder draußen bist. Bei Python weiß du es nicht ohne
Hilfmittel.
Vancouver schrieb:> G. P. schrieb:>> Die Frage ist doch ob mich die Zahl interessiert auf welcher Ebene ich>> nun bin>> Bei n-fach verschachtelten Schleifen oder if-Kaskaden weißt du nach n> Klammern, dass du wieder draußen bist. Bei Python weiß du es nicht ohne> Hilfmittel.
Anstatt die Verschachtelungen mitzuzählen, finde ich es praktischer,
einfach kurz zum Blockanfang (also zur nächstgelegenen, weniger weit
eingerückten Zeile nach oben) und wieder zurück zu springen. Dann sieht
man auch gleich, um welche Art von Block es sich handelt (if, for,
Funktionsdefinition etc.) und in welchem Kontext er angesiedelt ist.
Yalu X. schrieb:> Man darf in tief verschachteltem Code die einzelnen Blöcke aber auch> gerne mit einem Kommentar abschließen. Dann erkennt man nicht nur,> dass ein Block abgeschlossen wird, sondern auch gleich welcher :>> bla()> bla()> bla()> # end if> # end for z> # end for y> # end for x> blub()
Das ist jetzt nicht dein Ernst, oder? :-<
Da philosophierst du hier über eine Kette von Beiträgen, wie toll es ist
nur einzurücken und keine sichtbaren Zeichen zu haben. Und jeztz
das(?!)
Du ersetzt eine schließende Klammer durch einen Kommentar, wofür du
extra noch dein neues Symbol definierst: end.
Mehr fällt mir jetzt dazu auch nicht mehr ein, als end .
MaWin schrieb:> Vancouver schrieb:>>> Nein, es geht um Lesbarkeit und Verständlichkeit. Sourcecode, der diese>> Anforderungen nicht erfüllt, ist für die Tonne, egal wie gut er>> funktioniert.>>> Die Art und Weise, wie Python>> den Programmierer dazu zwingt,>> Also zwingt Python den Programmierer Code zu schreiben, der nicht für> die Tonne ist.
Grundkurs "Logik für Anfänger", Lektion 1, MaWin-Edition: Nur weil
Sourcecode, der nicht lesbar und/oder verständlich geschrieben ist, für
die Tonne ist, bedeutet das nicht, dass automatisch die Negation dieser
Behauptung falsch sein muss, d. h. lesbarer und/oder verständlich
geschriebener Code ist nicht automatisch nicht für die Tonne.
Oder plakativer: Auch mit Python lässt sich ganz hervorragend Code "für
die Tonne" schreiben.
hidden symbol schrieb:> Du ersetzt eine schließende Klammer durch einen Kommentar
Ich schrieb, dass man das so machen darf, nicht muss. Ich selber
mache es nicht so (falls dieser Eindruck entstanden sein sollte). Es ist
vielmehr als Hilfe für diejenigen gedacht, die sonst mit den
Einrückungen nicht zurecht kommen.
Dass einige C/C++-Programmierer solche Kommentare sogar zusätzlich zu
den sowieso erforderlichen Klammern verwenden, zeigt aber, dass sie
(zumindest für diese Leute) durchaus einen gewissen Nutzen haben.
> wofür du extra noch dein neues Symbol definierst: end.
Du darfst das "end" auch gerne durch "{" ersetzen oder einfach
weglassen. Du darfst die Kommentare auch komplett weglassen. Du darfst
auch weiterhin über die Einrückungen in Python schelten wie ein
Rohrspatz. Ich weiß nur nicht, was das bringen soll, außer dass du dich
hinterher vielleicht etwas besser fühlst ;-)
Vancouver schrieb:> @kev:> Diese Zwangseinrückerei treibt mich bei Python auch regelmäßig in den> Wahnsinn. Ich habe mir anfangs angewöhnt, jede Struktur mit einem> Kommentar abzuschließen, z.B.>>
1
> def aktion(self):
2
> geloescht = False
3
> if geloescht:
4
> do_something()
5
> # end if
6
> # end aktion()
7
>
Wenn man ein kluges Kerlchen wäre, könnte man natürlich anstelle eines
Kommentars eines der Schlüsselworte "pass" oder "return" benutzen. Aber
vermutlich muß man sich dazu mit der Sprache auskennen und einen
anständigen Editor benutzen.
hidden symbol schrieb:> MaWin schrieb:>> Bei Python ist das halt nicht so. Ob du es magst, oder nicht.>> Wenn die Formatierung bereits eindeutig die Blöcke definiert, warum>> sollte ich zusätzlich noch Klammern verlangen?>> Danke für die Bestätigung, dass Formatierung und Syntax bei Python> vermischt werden.
Nein, kleiner Troll. Guido van Rossum hat festgestellt, daß gute
Entwickler ihren Code ohnehin IMMER sauber formatieren -- und sich dann
überlegt: wenn die guten (also anscheinend nicht Du, wenn es Dich so
stört) das ohnehin tun, kann so etwas auch die Syntax wesentlich
einfacher und deutlich lesbarer machen.
hidden symbol schrieb:> Es geht nicht um hübsch, sondern um erforderlich.
Richtig -- und in Python ist es so, daß es ganz wunderbar ohne
Blockklammern auskommt. Sind Blockklammern also erforderlich? Nein,
offensichtlich nicht, es funktioniert ganz wunderbar ohne.
Vielen Dank, daß wir das abschließend klären konnten.
Dussel schrieb:> Ich könnte mir vorstellen, dass das bei vielen auch für die erzwungene> Einrückung gilt. Nur weil man sich nicht beschwert, heißt das nicht,> dass man sich nicht daran stört.> Ich denke, dazu gibt es keine Statistik, aber interessieren würde es> mich doch.
Naja... Python ist seit einiger Zeit die beliebteste
General-Purpose-Skriptsprache und führt seit Jahren die "Most Wanted
Programming Language"-Kategorie in den Umfragen von Stackoverflow an.
Vancouver schrieb:> Ich halte es für eine bessere Idee, alle nicht-funktionalen Aspekte des> Sourcecodes der Disziplin des Programmierers zu überlassen. Dazu gibt es> Styleguides, die jede Menge Empfehlungen enthalten,
Weißt Du, ich komme von Basic über Assembler und C zu C++, habe als
Skriptsprache lange Perl benutzt und bin dann zu Python gewechselt.
Bisschen anderes Zeugs habe ich auch noch mitgenommen, egal... weißt Du,
was der Unterschied ist?
In jeder anderen mir bekannten Sprache muß ich mir Mühe geben, lesbaren
Code zu schreiben. In Python muß ich mir Mühe geben, unlesbaren Code zu
schreiben.
Mal völlig davon abgesehen, das ich ein Faulerhund bin.... Lesbarkeit
hin o. her, mir gehts da erstmal ums Schreiben! Durch das automatisch
Einrücken fällt doch meist sofort auf, das da was nicht stimmen kann,
oder es meckert der Compiler. Also ohne, wäre MIR das viel zu
fehlerträchtig.
Sheeva P. schrieb:> Weißt Du, ich komme von Basic über Assembler und C zu C++, habe als> Skriptsprache lange Perl benutzt und bin dann zu Python gewechselt.
Bis auf Perl war es bei mir genauso. Nach Basic kam noch eine längere
Pascal-Phase. Oh Mann, das waren noch Zeiten...
Sheeva P. schrieb:> In Python muß ich mir Mühe geben, unlesbaren Code zu> schreiben.
Ja, weil der unlesbare Code in Python per Definition erst gar nicht
funktioniert. Das erinnert mich an einen meiner Mathematiklehrer (ca. 9.
Klasse), der uns selbst bei vollkommen richtig gelöster Aufgabe Punkte
abgezogen hat, wenn die Gleichheitszeichen nicht genau untereinander
gestanden haben. Da haben die Noten nicht mehr unbedingt die
Mathematikkenntnisse widergespiegelt.
Wie gesagt, ich sehe die Lesbarkeit des Codes in der Verantwortung des
Entwicklers, nicht des Tools. Der letzte Schritt bei der Entwicklung
einer Funktion ist immer das "Beautifying", also das Aufhübschen des
Codes mit Indents, Kommentaren, Docstrings etc., damit andere und man
selbst den Code auch nach Monaten noch versteht. Die meisten Entwickler
erfüllen diese Anforderung gerne, aber sie lassen sich solche Dinge
andererseits auch nicht gerne von einem Tool vorschreiben.
Vancouver schrieb:> Na, wieviele Einrückunsebenen liegen zwischen dem letzten bla() und dem> blub()? Eine? Zwei? Sieben?
Es ist eine völlig sinnlose Information zu wissen, wie viele Ebenen
zwischen Blockenden liegen.
Man muss sowieso zu den Blockanfängen scrollen, um die Blockenden
interpretieren zu können.
Und wenn die so weit auseinander sind, dass du dir die Finger
wundscrollst, dann ist deine Programmstruktur Mist. Unabhängig von der
Sprache.
MaWin schrieb:> Es ist eine völlig sinnlose Information zu wissen, wie viele Ebenen> zwischen Blockenden liegen.> Man muss sowieso zu den Blockanfängen scrollen, um die Blockenden> interpretieren zu können.>> Und wenn die so weit auseinander sind, dass du dir die Finger> wundscrollst, dann ist deine Programmstruktur Mist.
Erstens das, aber auch wenn ein Block ausnahmsweise einmal etwas länger
wird, muss man sich deswegen noch lange nicht die Finger wundscrollen.
Mit einem entsprechenden Editor/IDE-Plugin kann auch direkt zur
gewünschten Zeile und wieder zurückspringen. Für Vim gibt es dafür u.a.
IndentWise:
https://github.com/jeetsukumaran/vim-indentwise
Damit kann man mit einfachen Tastenkombinationen vorwärts oder rückwärts
zur nächstgelegenen Zeile mit kleinerer, gleicher, größerer oder absolut
vorgegebener Einrückungsebene springen. Mit Ctrl-O (Vim-Standardbefehl)
springt man genauso schnell wieder zur ursprünglichen Cursorposition
zurück. Mal schnell nachschauen, in welchem Block, in welcher Funktion
oder in welcher Klasse man sich gerade befindet, ist damit – unabhängig
von der Sprungweite – eine Sache von 1 bis 2 Sekunden.
Ich habe IndentWise ursprünglich mit dem Fokus auf Python installiert,
nutze es seither aber auch für Programmiersprachen mit Blockklammern,
weil es trotz seiner Einfachheit äußerst vielseitig ist.
Ich bin mir sicher, dass Emacs, Eclipse usw. ähnliche Möglichkeiten
bieten, man muss nur bereit sein, sie zu nutzen.
Vancouver schrieb:> Sheeva P. schrieb:>> In Python muß ich mir Mühe geben, unlesbaren Code zu>> schreiben.>> Ja, weil der unlesbare Code in Python per Definition erst gar nicht> funktioniert.
Ja. Super, oder?
> Wie gesagt, ich sehe die Lesbarkeit des Codes in der Verantwortung des> Entwicklers, nicht des Tools. Der letzte Schritt bei der Entwicklung> einer Funktion ist immer das "Beautifying", also das Aufhübschen des> Codes mit Indents, Kommentaren, Docstrings etc., damit andere und man> selbst den Code auch nach Monaten noch versteht.
Also Du beschwerst Dich darüber, daß Python Dir einen langweiligen,
überflüssigen, fehlerträchtigen und blöden Schritt erspart? Auf so eine
Idee würde ich nichtmal kommen, wenn mich jemand dafür bezahlt. ;-)
> Die meisten Entwickler> erfüllen diese Anforderung gerne, aber sie lassen sich solche Dinge> andererseits auch nicht gerne von einem Tool vorschreiben.
Aber daß das "Tool" ihnen krudes Klammer-Gehacke -- das auf deutschen
und anderen Tastaturen obendrein regelmäßig zu lustigen Verrenkungen
führt -- vorschreibt, das nehmen sie klaglos hin? Das ist doch nicht
Dein Ernst...
Sheeva P. schrieb:> Aber daß das "Tool" ihnen krudes Klammer-Gehacke -- das auf deutschen> und anderen Tastaturen obendrein regelmäßig zu lustigen Verrenkungen> führt -- vorschreibt, das nehmen sie klaglos hin?
Genau. Deswegen verwendest du in Python sicher auch keine Dictionaries
oder Listen, und Verschachtelungen davon schon gar nicht. Alles krudes
Klammer-Gehacke. Echt blöd jetzt, dass die nicht mit Indents
strukturiert sind.
Sheeva P. schrieb:> Das ist doch nicht> Dein Ernst...
Nee, war alles nur Spaß. Lassen wir's gut sein.
Sheeva P. schrieb:> In jeder anderen mir bekannten Sprache muß ich mir Mühe geben, lesbaren> Code zu schreiben. In Python muß ich mir Mühe geben, unlesbaren Code zu> schreiben.
Vergibt Python etwa automatisch sinnvolle Namen für Funktionen und für
Variablen? Muss das nicht mehr der Programmierer tun?
Wow, das ist ja eine tolle Sprache. :-D
Mark B. schrieb:> Sheeva P. schrieb:>> In jeder anderen mir bekannten Sprache muß ich mir Mühe geben, lesbaren>> Code zu schreiben. In Python muß ich mir Mühe geben, unlesbaren Code zu>> schreiben.>> Vergibt Python etwa automatisch sinnvolle Namen für Funktionen und für> Variablen? Muss das nicht mehr der Programmierer tun?
Das kommt darauf an, wie ich es programmiere. Schließlich ist Python
eine enorm dynamische Sprache, bei der ich ganz nach Belieben Klassen,
Methoden, und auch Funktionen erzeugen kann, schau mal:
1
#!/usr/bin/env python
2
# -*- coding: utf-8 -*-
3
fromfunctoolsimportpartial
4
fromnum2wordsimportnum2words
5
6
classYeah:
7
'''a class that dynamically creates its methods and names'''
Ach ja: das Programm benötigt natürlich offensichtlich das Paket
"num2words", welches nicht Teil der Standarddustribution ist, mit "pip
install num2words" jedoch ganz leicht nachinstalliert werden kann --
vielleicht besser in einer virtuellen Umgebung (virtualenv oder venv).
> Wow, das ist ja eine tolle Sprache. :-D
Ja, nicht wahr? Wobei, am Rande bemerkt und um der nächsten
"hochintelligenten Frage" vorzubeugen, das oben Gezeigte natürlich nur
ein vereinfachtes Beispiel ist. In der realen Welt kann man mit so etwas
unglaublich coole Sachen machen, beispielsweise nutze ich solche Tricks
gerne, um dynamische Klassen aus meinen Konfigurationsdateien zu
erzeugen, oder gerne auch Webformular-Klassen mit dem WTForms-Modul und
Daten aus einer Konfigurationsdatei oder einer Datenbank. Oh, ach ja: in
einer realen Welt würde ich natürlich Getter (und eventuell Setter) mit
einem Descriptor erzeugen und an die Klasse statt der Instanz binden.
;-D
Nein, im Ernst: wenn Du Fragen zu Python hast, bist Du mir natürlich
jederzeit sehr herzlich willkommen. Bis dahin empfehle ich immer wieder
gerne den Artikel von Eric S. Raymond, dessen Erfahrungen meinen
ausgesprochen ähnlich sind, von unserer anfänglichen Ablehnung wegen
dieser Sache mit dem Whitespace, über das Beeindrucktsein, bis hin zum
Verlieben: [1]. Viel Vergnügen beim Lesen! :-)
[1] https://www.linuxjournal.com/article/3882
Vancouver schrieb:> Sheeva P. schrieb:>> Aber daß das "Tool" ihnen krudes Klammer-Gehacke -- das auf deutschen>> und anderen Tastaturen obendrein regelmäßig zu lustigen Verrenkungen>> führt -- vorschreibt, das nehmen sie klaglos hin?>> Genau. Deswegen verwendest du in Python sicher auch keine Dictionaries> oder Listen, und Verschachtelungen davon schon gar nicht. Alles krudes> Klammer-Gehacke. Echt blöd jetzt, dass die nicht mit Indents> strukturiert sind.
Aber dann wären sie doch wieder unleserlich, weißt Du. Das ist aber
eines der wichtigsten Designziele von Python, die Lesbarkeit des Code.
Und das funktioniert ziemlich gut, weißt Du -- jedenfalls, wenn man
einen Editor mit einer brauchbaren Unterstützung dafür hat. Mein GNU
Emacs kann das jedenfalls perfekt, so benötige ich keinen Beautifier und
keinen zusätzlichen Bearbeitungsschritt, bevor ich den Code committe.
Andererseits möchte ich Dir nicht verheimlichen, daß ich eine gewisse
Genugtuung empfinde, daß Dir ganz offensichtlich die sachlichen
Argumente ausgehen und Du deswegen versuchst, das Ganze ins Lächerliche
zu ziehen. Ja, bitte entschuldige, ich bin ein furchtbar schlechter
Mensch. :-)
> Sheeva P. schrieb:>> Das ist doch nicht>> Dein Ernst...>> Nee, war alles nur Spaß. Lassen wir's gut sein.
Klar, gerne. Können wir dann bitte auch zukünftig das dusselige Genöle
über diese Sache mit dem Whitespace lassen, daß nahezu unweigerlich in
jedem Python-Thread auftaucht, und das jeder Python-Nutzer schon bis zum
Erbrechen gehört, gelesen, und meist auch schon mit Rauchzeichen,
Morsecode und in ROT-13 erklärt bekommen hat -- üblicherweise von...
Leuten, die ihrerseits keinerlei Erfahrung mit der Sprache haben? Das
wäre doch echt mal cool, Dieter Nuhr zu folgen, findest Du nicht? Ich
mein', echt jetzt: verspürst Du dasselbe Bedürfnis, jeden anzuhalten,
der ein Auto in Goldmetallic fährt, um ihm zu erklären, daß der Wagen
doch in orange oder blau viel cooler aussähe?
Siehst Du, die Sache ist manchmal ganz simpel. Python ist so, wie es
ist. Ob Dich das jetzt stört oder nicht, interessiert keine Sau -- von
den Python-Usern genau so wenig wie von den Nichtbenutzern. Du wirst mit
Deinem hundertausendsten Genöle sicher nichts daran ändern, und wenn Du
etwas daran ändern willst, dann benutz' doch einfach den handelsüblichen
Mechanismus von Opensource-Software und biete einen Python-Fork an, der
Deine geliebten Klammern und Verrenkungen erzwingt. Oh, natürlich gibt
es sowas schon längst, aber weil es nicht von Dir herausragendem,
großartigen und allwissenden Programmiergenie ist, benutzt es halt
keiner... ok, natürlich könnte es auch sein, daß die Python-User mit der
Sprache glücklich sind wie sie ist, aber die sind halt alle vollkommen
dämlich und keine herausragenden Geistesgrößen und Überdeveloper so wie
Du.
Andererseits könntest Du natürlich auch eine Middleware entwickeln,
vielleicht mit lex flexx und yacc bison, textX, pyparsing -- you get
the idea -- das jene häßlichen Klammerorgien, auf die Du anscheinend
nicht verzichten kannst, in validen, aber zufällig formatierten
Python-Code übersetzt. Damit hast Du sogar Deinen geliebten letzten
Bearbeitungsschritt, das wäre doch super! Und, ach ja: wenn Du es mit
Deinem verkrüppelten Dialekt in den nächsten 25 Jahren schaffst, auch
nur näherungsweise so erfolgreich zu sein wie Python, dann verspreche
ich, Deine Einwände ernst zu nehmen und für sinnvoll zu halten. Viel
Erfolg und viel Glück dabei... Du wirst es brauchen. :-D
Sheeva P. schrieb:> Oh, ach ja: in einer realen Welt würde ich natürlich Getter (und eventuell> Setter) mit einem Descriptor erzeugen und an die Klasse statt der Instanz> binden. ;-D
Wobei eine standardmäßige Verwendung von Gettern und Settern dem
Grundgedanken der Datenkapselung in der OOP zuwider läuft:
https://www.infoworld.com/article/2073723/why-getter-and-setter-methods-are-evil.html> Nein, im Ernst: wenn Du Fragen zu Python hast, bist Du mir natürlich> jederzeit sehr herzlich willkommen.
Wenn Du mir vielleicht ein gutes Python-Tutorial oder Buch empfehlen
könntest? Speziell für Leute die seit Jahren die Syntax von C/C++/Java
gewohnt sind? :-)
Mark B. schrieb:> Sheeva P. schrieb:>>> Oh, ach ja: in einer realen Welt würde ich natürlich Getter (und eventuell>> Setter) mit einem Descriptor erzeugen und an die Klasse statt der Instanz>> binden. ;-D>> Wobei eine standardmäßige Verwendung von Gettern und Settern dem> Grundgedanken der Datenkapselung in der OOP zuwider läuft:
Was ist in Python eigentlich ein Deskriptor?
>> Nein, im Ernst: wenn Du Fragen zu Python hast, bist Du mir natürlich>> jederzeit sehr herzlich willkommen.>> Wenn Du mir vielleicht ein gutes Python-Tutorial oder Buch empfehlen> könntest? Speziell für Leute die seit Jahren die Syntax von C/C++/Java> gewohnt sind? :-)
Na [1].
[1] https://docs.python.org/3/tutorial/
kleine Anmerkung noch bzw. Tipp für Anfänger und Fortgeschritene
googelt mal nach linter für python ... mypy, pyright, pytype
ich verwende pyright seit längerem und bin sehr zufrieden
mypy übersieht viele Fehler
mit pytype habe ich keine Erfahrung