Stringvergleich

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
Peter18
User
Beiträge: 13
Registriert: Samstag 9. November 2019, 12:14

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
Benutzeravatar
__blackjack__
User
Beiträge: 14077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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}")
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Peter18
User
Beiträge: 13
Registriert: Samstag 9. November 2019, 12:14

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
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Benutzeravatar
kbr
User
Beiträge: 1508
Registriert: Mittwoch 15. Oktober 2008, 09:27

@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.
Peter18
User
Beiträge: 13
Registriert: Samstag 9. November 2019, 12:14

In der Tat, der Doppelpinkt muß beim Kopieren verlohren gegangen sein.
karolus
User
Beiträge: 144
Registriert: Samstag 22. August 2009, 22:34

Das 'h' in velohren könntest du losschicken um das 'i' in Doppelpinkt gegen ein 'u' zu tauschen, das 'h' muss nicht zurückkommen.
Benutzeravatar
__blackjack__
User
Beiträge: 14077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten