Seite 1 von 1

Stringvergleich

Verfasst: Montag 8. November 2021, 12:59
von Peter18
Ein freundlichs Hallo an alle,

ich möchte aus einer Konfigurationsdatei einen Bool-Wert in mein Programm übernehmen. Dazu habe ich folgende Funktion geschrieben:

Code: Alles auswählen

def GetBoolVal( ln ):
  r = False
  n,v = ln.split( "=" )
  if v =="True"
    r = True
  if v == "False":
    r = False
  return bool( r )
Dabei ist "ln" eine Zeile der Konfigurationsdatei. Mit "split" trenne ich Variable und Wert. "r = False" sollte vielleicht besser "None" sein. Den Wert ("True" oder" False") direkt als bool(v) zurückzugeben hat nicht funktioniert. Eine weitere Idee war Strinvergleich, wie oben gezeigt. Aber es funktioniert nicht.

Hat jemand einen Tipp, was da falsch läuft, oder vielleicht eine bessere Lösung??

Grüße von der Nordsee

Peter

Re: Stringvergleich

Verfasst: Montag 8. November 2021, 13:12
von __blackjack__
@Peter18: Das ist offensichtlich nicht der tatsächliche Code, denn hier ist das Problem sehr offensichtlich ein Syntaxfehler.

Funktionsnamen werden klein_mit_unterstrichen geschrieben, und ein- oder zweibuchstabige Variablennamen sind schlecht.

Nach der öffnenden Klammer und vor der schliessenden Klammer bei den Argumenten gehört kein Leerzeichen.

Einen Wahrheitswert noch mal mit `bool()` in einen Wahrheitswert zu wandeln ist sinnfrei. `r` an sich ist sinnfrei weil man ja nicht nur ein ``return`` am Ende haben kann.

`split()` ist hier potentiell ”gefährlich”, denn das wird so nicht funktionieren wenn in der Zeile a) kein "=" enthalten ist, oder b) mehr als ein "=" enthalten ist. Für solche Fälle würde ich `partition()` verwenden.

Vermutlich wird Dein Problem sein, das in der Datei nicht "be_cool=True" steht, sondern so etwas wie "be_cool = True". Dann vergleichst Du " True" mit "True". Was unwahr ist. Oder bei den Zeilen hängt am Ende noch ein Zeilenendezeichen dran. Auch "True\n" und "True" sind nicht gleich.

Code: Alles auswählen

def get_boolean_value(line):
    _, _, value = line.partition("=")
    value = value.strip()
    
    if value == "True":
        return True
    
    if value == "False":
        return False

    raise ValueError(f"not a boolean value: {value!r}")

Re: Stringvergleich

Verfasst: Montag 8. November 2021, 14:38
von Peter18
Hallo __blackjack__,
@Peter18: Das ist offensichtlich nicht der tatsächliche Code, denn hier ist das Problem sehr offensichtlich ein Syntaxfehler.

Funktionsnamen werden klein_mit_unterstrichen geschrieben, und ein- oder zweibuchstabige Variablennamen sind schlecht.

Nach der öffnenden Klammer und vor der schliessenden Klammer bei den Argumenten gehört kein Leerzeichen
Ich habe nicht nach Konventionen gefragt, denn offensichtlich ist die Schreibweise kein Syntaxfehler!!!
`split()` ist hier potentiell ”gefährlich”,
Siehe oben! Für die Konfiguration gelten gewisse Vorschriften!! Der "bool()" sollte nur diesen Typ sicherstellen, ein Experiment.
Dann vergleichst Du " True" mit "True". Was unwahr ist.
Was ist daran ungleich??? Wegen derartiger Aussagen bin ich hier gelandet!!

Ein sehr guter Hinweis ist "True\n". Ein "replace('\n', '')" hat geholfen!!

Grüße von der Nordsee

Peter

Re: Stringvergle

Verfasst: Montag 8. November 2021, 14:48
von __deets__
Der fehlende Doppelpunkt ist offensichtlich ein Syntaxfehler!!!!!!!!

Wenn du genau hinschauen würdest, dann siehst du, das ein Leerzeichen vor dem True steht!!!!!!!!!!!!!!

Leerzeichen, Tabulatoren, und 7 Sorten Zeilenumbrüche werden alle mit Strip entfernt, vor und hinter dem gesuchten Text, statt das Rad mühselig mit replace neu zu erfinden!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Re: Stringvergleich

Verfasst: Montag 8. November 2021, 14:54
von kbr
@Peter18: In Zeile 4 hast Du in der Tat einen Syntaxfehler und "True" ist tatsächlich nicht gleich " True". Ansonsten hast Du ein umfassendes Code-Review bekommen mit einem sauberen Beispielcode. Wenn das keine Hilfe ist.

Re: Stringvergleich

Verfasst: Montag 8. November 2021, 15:13
von Peter18
In der Tat, der Doppelpinkt muß beim Kopieren verlohren gegangen sein.

Re: Stringvergleich

Verfasst: Montag 8. November 2021, 15:51
von karolus
Das 'h' in velohren könntest du losschicken um das 'i' in Doppelpinkt gegen ein 'u' zu tauschen, das 'h' muss nicht zurückkommen.

Re: Stringvergleich

Verfasst: Montag 8. November 2021, 22:11
von __blackjack__
@Peter18: Der Hinweis auf Konventionen ist gratis. Den gibt's quasi konventionell mit dazu. 😇

Was meinst Du bei `split()` mit „siehe oben“? Das schon niemand gegen die Vorschriften verstösst, die für Konfigurationsdateien gelten? Das funktioniert genau so gut wie fehlende Doppelpunkte in Quelltexten. Für Python-Quelltext gelten ja auch gewisse Vorschriften. Und dann vertippt man sich, oder kopiert etwas nicht mit, oder Zeilenumbrüche gehen aus irgendeinem Grund verloren und man hat zwei Schlüssel-Wert-Paare/Zuweisungen in einer Zeile stehen, oder…

`replace()` über die gesamte Zeichenkette ist irreführend wenn man eigentlich nur ein Zeichen *am Ende* erwischen will. Und eigentlich sind jegliche ”whitespace” vor und nach dem Wert ein Problem. Deswegen ist `strip()` sinnvoller.