Hat Python Probleme mit Tabs und Leerzeichen ?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Hello World
User
Beiträge: 2
Registriert: Dienstag 29. September 2020, 13:34

Ich habe zur Einarbeitung eine kleine Funktion geschrieben. Sie liest eine Textdatei aus und überprüft, ob ein Wort vorhanden ist.

datei = open('Konfiguration.txt','r')

for zeile in datei:
Suchwort = zeile.partition("Window:")
if Suchwort[1] == "Window:":
print("Wort vorhanden")
break

Dauernd erhalte ich die Fehlermeldung "TabError: inconsistent use of tabs and spaces in indentation"
Wenn ich das "break" weglasse, funktioniert das Skript. Solche Probleme habe ich mit Javascript oder PHP nicht.
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Du weißt aber schon, dass die _Einrückung_ bei Python fundamental ist? Es also _wichtig_ dass korrekt eingerückt ist, weil damit ein Block deklariert wird.

Es gibt einen Styleguide für Python ( PEP 8 ), den du dir anschauen solltest. Darin steht nicht nur, dass man Vairablennamen klein_mit_unterstrich schreibt, sondern auch, dass man immer mit 4 Leerzeichen einrückt. Das tust du nicht. Da Python nicht raten kann, was du nun womit meinst, steigt es mit der entsprechenden Fehlermeldung aus. Du benutzt in deinem Code nämlich beides. Leerzeichen und Tabs.
Hello World
User
Beiträge: 2
Registriert: Dienstag 29. September 2020, 13:34

Ich habe jetzt eine Lösung entdeckt:
Wenn man in MS Visual Studio Code die Zeilen markiert, wird im Hintergrund schwach ein Pfeil für ein Tab und ein Punkt für ein Leerzeichen angezeigt. Diese Zeichen müssen für jede Zeile penibel übereinstimmen. Bei mir entsprach ein Tab vier Leerzeichen. Als ich das Tab-Symbol durch die vier Leerzeichen ersetzte, funktionierte das Skript. Ich bin zwar erst in der Einarbeitungsphase, aber besonders zuverlässig erscheint mir Python nicht.
narpfel
User
Beiträge: 691
Registriert: Freitag 20. Oktober 2017, 16:10

Eine „Fail-Fast“-Herangehensweise ist nicht unzuverlässig, sondern verhindert zuverlässig, dass etwas passiert, womit man nicht rechnet. Ein Tab kann (je nach Einstellung des Texteditors) unterschiedlich dargestellt werden. Beispiel:

Code: Alles auswählen

def foo():
....if condition:
........do_something()
[tab]   do_something_else()
Wenn ein Tab vier Leerzeichen entspricht, sieht es so aus, als wenn `do_something_else()` außerhalb des `if`-Blocks steht, bei 8 sieht es so aus, als wenn es darin steht. Genau aus diesem Grund ist es in Python verboten, Tabs und Leerzeichen zu mischen.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das du deine Code nicht korrekt formatierst sagt nichts über Pythons Zuverlässigkeit aus. Auch PHP und JavaScript schmeißen Fehler, wenn man Zeichen weglässt, die ihnen wichtig sind. Das sind nur andere.
nezzcarth
User
Beiträge: 1764
Registriert: Samstag 16. April 2011, 12:47

Hello World hat geschrieben: Dienstag 29. September 2020, 18:46 Ich bin zwar erst in der Einarbeitungsphase, aber besonders zuverlässig erscheint mir Python nicht.
Na ja, die Einrückungen sind Teil der Syntax und die muss man halt einhalten. Es gibt zwei andere Sprachen die mit P anfangen und die nachgiebiger und dafür bekannt sind, zu raten, was der Programmierer gemeint haben könnte. Python ist da strenger. Was meinst du denn mit "nicht zuverlässig"?
Benutzeravatar
noisefloor
User
Beiträge: 4194
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Bei mir entsprach ein Tab vier Leerzeichen
So stellen Python-Programmierer auch normalerweise den Editor / die IDE ihrer Wahl ein: beim Druck auf Tab werden vier Leerzeichen eingefügt. Das entspricht dann auch der Vorgabe der PEP8.

Das mit der Einrückung und das wie der Einrückung ist so ziemlich das fundamentalste, was es bei Python gibt. Das wird auch normalerweise ziemlich früh in jedem Tutorial erwähnt...

Gruß, noisefloor
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Also hier nochmal der Code, wie er eingerück aussieht:

Code: Alles auswählen

datei = open('Konfiguration.txt','r')

for zeile in datei:
	Suchwort = zeile.partition("Window:")
	if Suchwort[1] == "Window:":
    		print("Wort vorhanden")
		break
Die print-Zeile fängt mit 4 Leerzeichen an, sieht man natürlich nicht, weil das Tab dann auf 8 Stellen erweitert.
Jeder vernünftige Editor kann übrigens Tabs in Spaces und umgekehrt umwandeln. Das sollte man bei solchen Einrückfehlermeldungen als erstes machen.

Zum eigentlichen Code:
Dateien öffnet man innerhalb des with-Statements, damit sie auch wieder zuverlässig geschlossen werden. Text-Dateien sollte man immer mit einem (dem richtigen) Encoding öffnen.
Variablennamen werden immer komplett klein geschrieben. Wenn nur geprüft werden soll, ob ein Wort in der Zeile ist, ist `partition` etwas übertrieben:

Code: Alles auswählen

with open("Konfiguration.txt", encoding="utf8") as lines:
    for line in lines:
        if "Windows:" in line:
            print("Wort vorhanden")
            break
Sollte es sich wirklich um eine Konfigurationsdatei handeln, dann ist die Endung verwirrend. Für Standard-Konfigurationsformate gibt es auch schon fertige Module.
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Das ganze mit `any()` und einem Generatorausdruck noch etwas kompakter ausgedrückt:

Code: Alles auswählen

with open("Konfiguration.txt", encoding="utf8") as lines:
    if any("Windows:" in line for line in lines):
        print("Wort vorhanden.")
Ergänzend zum Kommentar von Sirius3 bezüglich Module für Standardformate: Sollte die Datei nicht in einem solchen Format vorliegen, das Format aber in Deiner Hand liegen, dann erfinde nix neues, sondern such Dir einen passenden Standard.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten