Syntax-Error bei Fehlerlosem code?

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.
Meishere
User
Beiträge: 27
Registriert: Montag 24. Januar 2011, 16:54

Hallo an alle...
Ich habe folgendes Problem:
Ich bin dabei (zu Übungszwecken) einen kleinen Passwort-Generator zu coden.
Eigentlch läuft er ganz prima, aber nahcdem ich noch ein paar letzte Ergänzungen gemacht habe, bekam ich einen Syntax-Fehler zurück und zwar an einer Stelle, an der vorher alles ok war.

Ich poste einfach mal das Stück aus dem Code, mit dem Python Probleme hat (daher fehlen die Vorgaben für die Variablen).
Sollte der ganze Code benötigt werden, kann ich den natürlich auch posten:)

Code: Alles auswählen

#Erstellung des Passworts
    if zahlen=="j" and groß=="j" and klein=="j":#An dieser Stelle wird gesagt "Syntax Error" und die ganze restliche Zeile markiert.
      for x in range(0,laenge): 
      passwortTemp=random.choice("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890")
      passwort=passwort+str(passwortTemp)
Ich hoffe ihr könnt mir helfen.
Danke im Vorraus,
Meishere
Zuletzt geändert von Meishere am Freitag 11. Februar 2011, 19:42, insgesamt 1-mal geändert.
Jetzt sind die guten alten Zeiten, nach denen wir uns in zehn Jahren zurücksehnen.
Peter Ustinov

Jeder Mensch macht Fehler. Das Kunststück liegt darin, sie dann zu machen, wenn keiner zuschaut.
Peter Ustinov
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Tja, da fehlt halt ne schließende Klammer. Den Rest spar ich mir jetzt mal, weil ich Fernsehen gucken will. :)
BlackJack

@Meishere: Direkt nach dem ``if`` steht eine öffnende Klammer. Wo ist die dazugehörige schliessende Klammer?

Wobei ich eher die öffnende weglassen würde.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Die fehlende schließende runde Klammer ist das Problem! Die Klammerung ist zudem auch unnötig.

Mist, BlackJack war schneller :mrgreen:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Meishere
User
Beiträge: 27
Registriert: Montag 24. Januar 2011, 16:54

Ah sorry.
Die erste Klammer wird dort nicht benötigt (meiner Meinung nach.) Das war nur ein Test, aber auch mit schließender Klammer ging's nicht.
Habe vergessen die erste Klammer zu entfernen. Du warst schneller als ich (Ich hatte es gerade gesehen ;))

EDIT: Tja, das gleiche für BlackJack und Hyperion :D Übrigens funktioniert diese Schleife, wenn ich sie aus dem Code herausnehme, die Variablen ergänze und sie einzeln ausführe.
Jetzt sind die guten alten Zeiten, nach denen wir uns in zehn Jahren zurücksehnen.
Peter Ustinov

Jeder Mensch macht Fehler. Das Kunststück liegt darin, sie dann zu machen, wenn keiner zuschaut.
Peter Ustinov
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

Hast du immer noch einen Syntax-error? (du hast offensichtlich dein Posting geändert, ohne was dranzuschreiben).

Mir fällt noch die Variable 'groß' auf: das funktioniert wenn das Encoding korrekt ist (bzw. angegeben ist, wenns nicht utf-8 ist) nur mit python 3.x, falls du unbemerkt die Dateikodierung oder den Python-interpreter gewechselt hast, geht jetzt nicht mehr.

Außerdem ist in deinem post 'for' falsch eingerückt (Mischst du etwa Tabs und Leerzeichen? das ist in python 3 nicht erlaubt).
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

b.esser-wisser hat geschrieben:Hast du immer noch einen Syntax-error? (du hast offensichtlich dein Posting geändert, ohne was dranzuschreiben).
Leider ja!

Es könnte ansonsten noch an einer falschen Einrückung liegen, denn so, wie die if-Bedingung dort jetzt steht, ist es syntaktisch korrekt.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Meishere hat geschrieben:Die erste Klammer wird dort nicht benötigt (meiner Meinung nach.) Das war nur ein Test, aber auch mit schließender Klammer ging's nicht.
Habe vergessen die erste Klammer zu entfernen. Du warst schneller als ich (Ich hatte es gerade gesehen ;))
Es ist kein gute Idee, nachträglich den Fehler aus dem geposteten Code herauszueditieren. So kann niemand mehr das Problem nachvollziehen.
Meishere hat geschrieben:Übrigens funktioniert diese Schleife, wenn ich sie aus dem Code herausnehme, die Variablen ergänze und sie einzeln ausführe.
Die for-Schleife kann eigentlich nicht funktionieren, da du den auszuführenden Code nicht eingerückt hast.


Ich finde es übrigens sehr mutig Code als fehlerlos zu bezeichnen wenn die Software etwas ganz anderes dazu sagt. Du hast damit einen Bug in Python selber unterstellt und das ist gerade bei einem SyntaxError eine höchst gewagte Aussage.
Zuletzt geändert von /me am Freitag 11. Februar 2011, 20:02, insgesamt 1-mal geändert.
Meishere
User
Beiträge: 27
Registriert: Montag 24. Januar 2011, 16:54

Ich muss mich abermals entschuldigen :)
Ich habe imemrnoch einen Syntax-Error (wie gesagt ich habe nur die Klammer entfernt, um weitere Missverständisse zu vermeiden).
Da ich Python 3.1 verwende funktioniert die Variable. Ich habe gerade vorsichtshalber zum Überprüfen noch ein kleines script mit derselben Variable geschrieben und es funktionierte einwandfrei. Außerdem wird ja auch nicht groß sinder der Bereich nach dem Doppelpunkt markiert.
Das for ist leider aufgrund des postens falsch eingerückt. (Wahrscheinlich weil ich den Kommentar nach dem Doppelpunkt erst hier im Forum dazugeschrieben habe.) Ich benutze immer brav die "4-Leerzeichen-Regel" :D

Ich habe auch schon intensive Fehlersuche betrieben, aber offenbar reichen meine Kenntnisse nicht aus :(

P.S.: Ja Hyperion hat recht ;)

EDIT: @ /me: Ich habe ja nicht den Fehler, sondern ein Überbleibsel, was da nicht sein sollte entfernt. So kann jeder das eigentliche Problem erkennen. Und zur for-schleife steht ja schon oben etwas :D
Jetzt sind die guten alten Zeiten, nach denen wir uns in zehn Jahren zurücksehnen.
Peter Ustinov

Jeder Mensch macht Fehler. Das Kunststück liegt darin, sie dann zu machen, wenn keiner zuschaut.
Peter Ustinov
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Meishere hat geschrieben:Ich habe imemrnoch einen Syntax-Error
Dann liegt der Fehler ziemlich sicher in der Zeile (oder den Zeilen) davor. Eine fehlende schließende Klammer oder ein nicht beendeter String gehören dabei zu den üblichen Verdächtigen.
BlackJack

@Meishere: Dann wird der Fehler irgendwo vor der Schleife liegen und der Doppelpunkt ist halt die Stelle an der der Compiler merkt, dass es so keinen Sinn ergibt. Das kann zum Beispiel irgendwo vor der Schleife auch wieder eine Klammer sein, die nicht geschlossen wird.
Meishere
User
Beiträge: 27
Registriert: Montag 24. Januar 2011, 16:54

Oh man...
Soviel zur "intensiven" Fehlersuche...
Natürlich lags an einer fehlenden Klammer. Dabei hatte ich eigentlich alle Zeilen nochmal nach fehlenden Klammern durchsucht.
Und dann war's die Zeile direkt darüber.
Naja... Danke an alle.
Und entschuldigung für meine "Blödheit" und das "stehlen" eurer Zeit :mrgreen:
Jetzt sind die guten alten Zeiten, nach denen wir uns in zehn Jahren zurücksehnen.
Peter Ustinov

Jeder Mensch macht Fehler. Das Kunststück liegt darin, sie dann zu machen, wenn keiner zuschaut.
Peter Ustinov
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Meishere hat geschrieben:Natürlich lags an einer fehlenden Klammer. Dabei hatte ich eigentlich alle Zeilen nochmal nach fehlenden Klammern durchsucht.
Und dann war's die Zeile direkt darüber.
Weiß jetzt natürlich nicht, mit welchem Editor Du arbeitest. Viele Editoren bieten neben Syntaxhighlighting auch die Funktion, zu einer Klammer das passende Gegenstück (sofern vorhanden... :wink: ) anzuzeigen.
Macht das Leben einfacher...

mutetella


P.S. Einen geposteten Code nachträglich zu verändern ist 'ne fiese Sache... :roll:
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Meishere
User
Beiträge: 27
Registriert: Montag 24. Januar 2011, 16:54

Naja... Ich arbeite mit dem Standart Python-Editor... Der direkt dabei ist (von der IDLE? :mrgreen: )
Vielleicht sollte ich mir wirklich nen anderen zulegen, allerdings ist das in der Schule halt so, dass dort alles eher "kompliziert" gemacht wird, weswegen zum Beispiel auf den Computern auch alle Version von 2.5 bis 3.1 vertreten sind. Aber alle PC's auf den gleichen Stand zu bringen ist natürlich keine Option (warum auch immer).
Und deswegen halte ich mich lieber an denselben Editor wie in der Schule, sonst wird's mir zu schwer immer umzudenken :D

P.S.: Ok Ok. Ich werde keinen Code mehr ändern :wink:
Gruß
Jetzt sind die guten alten Zeiten, nach denen wir uns in zehn Jahren zurücksehnen.
Peter Ustinov

Jeder Mensch macht Fehler. Das Kunststück liegt darin, sie dann zu machen, wenn keiner zuschaut.
Peter Ustinov
BlackJack

@Meishere: Vielleicht noch mal eine eher inhaltliche Anmerkung zu dem Quelltext:

Der gezeigte Quelltext lässt vermuten, dass Du da bis zu acht solcher ``if``-Anweisungen im Programm hast, bei denen im Grunde immer der gleiche Inhalt steht bis aus was beim `choice()`-Aufruf als Argument steht. Darüber solltest Du noch einmal nachdenken, denn solche Quelltextwiederholungen sollte man vermeiden. Die machen Programme unnötig lang und fehleranfällig; insbesondere wenn man mal Änderungen vornimmt und immer aufpassen muss, dass man alle "Kopien" entsprechend ändert.

Was bewirkt eigentlich der `str()`-Aufruf bei `passwortTemp`?

Und zur Form:

Ob und wie die Einrückung im Original aussieht ist ja nicht so ganz klar, darum ist das vielleicht unnötig, dass ich auf die vier Leerzeichen pro Einrückebene aus dem Style Guide hinweise. Ansonsten empfiehlt der noch Leerzeichen um Operatoren und Zuweisungen (ausserhalb von Argumentlisten) und ein Leerzeichen nach Kommas. Das dient der besseren Lesbarkeit.

Bei der Namensgebung sagt der Style Guide für alles ausser Klassennamen und Konstanten eigentlich Kleinbuchstaben und Unterstriche, also `passwort_temp` statt `passwortTemp`. Der Name könnte treffender gewählt werden. `passwort_zeichen` oder nur `zeichen` zum Beispiel. Oder man lässt den Zwischenschritt über einen extra Namen ganz weg.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Eventuell könnte auch das hier für Dich interessant sein...
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Meishere
User
Beiträge: 27
Registriert: Montag 24. Januar 2011, 16:54

Danke für die tipps :D
@BlackJack: Wie gesagt benutze ich immer brav die vier Leerzeichen ;) Das mit den Variablen Namen hab ich vergessen, stimmt. Leider wird auch soetwas in der Schule nicht erwöhnt, was allerdings von Vorteil wäre.
Und dass man Wiederholungen vermeiden sollte ist mir auch klar, allerdings bin ich noch ein Anfänger und mir fällt keine passende Lösung ein. Das einzige ist "elif", allerdings ist der Unterschied zu wiederholtem "If" ja nicht so groß (zumindest auf die Quelltextlänge bezogen. Ich habe übrigens 5 von diesen If-Anweisungen :) )
Der str()-Aufruf bewirkt in diesem Fall... gar nichts... wie gerade auffält :mrgreen:
Ich hatte das generieren des Passwortes vorher über einen anderen Weg versucht und da hat der str-Aufruf bewirkt, dass das Programm die Zahlen mit den Buchstaben "addieren" kann, sodass ein Passwort aus Buchstaben und Zahlen entsteht.

@mutetella: Danke für den Link. Die documentation kenne ich natürlich, aber ich kenne (noch?) nicht alle Aufrufe. Daher hilft mir das villeicht. Ich muss mir das mal in Ruhe durchlesen.

Gruß,
Meishere

EDIT: @BlackJack: Ich habe auch deinen Vorschlag die Temp-Variable rauszunehmen beherzigt und verstanden ( :!: ) Das war auch noch von dem ersten Versuch übrig und ich dachte ich würde es brauchen.

@mutetella: Das string-module hilft auf jedenfall den Quelltext ein wenig kleiner zu machen, danke :D
Jetzt sind die guten alten Zeiten, nach denen wir uns in zehn Jahren zurücksehnen.
Peter Ustinov

Jeder Mensch macht Fehler. Das Kunststück liegt darin, sie dann zu machen, wenn keiner zuschaut.
Peter Ustinov
BlackJack

@Meishere: ``elif`` würde ja auch nicht die Wiederholungen vermeiden. Wenn man mal hinschreibt was alle ``if``-Zweige gemeinsam haben und das was bei jedem anders ist durch einen Namen ersetzt, dann dürfte diese Schleife doch ungefähr so aussehen:

Code: Alles auswählen

    passwort = ''
    for _x in range(laenge): 
        zeichen = random.choice(erlaubte_buchstaben)
        passwort += zeichen
Und diese Schleife sollte nur einmal im Programm stehen. Vor der Schleife musst Du Dir jetzt überlegen was Du an `erlaubte_buchstaben` bindest. Und zwar mit weniger als fünf ``if``-Abfragen. Mit ``if``\s die nur ganz einfache Bedingungen enthalten -- ohne ``and`` oder so.
Meishere
User
Beiträge: 27
Registriert: Montag 24. Januar 2011, 16:54

Also die einzige Lösung die mir einfällt, würde immernoch 5 if-anweisungen beinhalten. Wenn man fünf verschiedene Mlglichkeiten hat, die über eine Benutzereingabe ausgewählt werden, dann geht das doch nicht anders oder?
Jetzt sind die guten alten Zeiten, nach denen wir uns in zehn Jahren zurücksehnen.
Peter Ustinov

Jeder Mensch macht Fehler. Das Kunststück liegt darin, sie dann zu machen, wenn keiner zuschaut.
Peter Ustinov
Benutzeravatar
DaMutz
User
Beiträge: 202
Registriert: Freitag 31. Oktober 2008, 17:25

@Meishere: aber es sind doch nur 3 Bedingungen die jeweils 'True' oder 'False' sein können? Dann sollte es auch mit 3 einfachen if-Bedingungen möglich sein.
Antworten