str in andere Typen wandeln

Hi,
war grad auf der Jagd nach einem Bug in meinem Programm und musste feststellen dass die bool() Funktion in Python nicht so arbeitet wie ich es von anderen aehnlichen Funktionen (int(), str()) gewohnt bin...
Ich haette erwartet das bei Anwendung auf einen String "False" False herauskommt, aber da der String nicht leer ist ist kommt True heraus.
Ist natuerlich vollkommen legitim dies so zu definieren und in der Doku (die ich zuegegebenermassen vorher nicht konsultiert hatte) auch so ausgewiesen deswegen meine Frage:
Gibts ein Modul das mir Konvertierungsfunktionen fuer str<->Blah bereitstellt. Fuer Integer funktioniert int() gut und in einen String geht normalerweise gut mit str(), aber wie z.B. eine Stringrepraesentation wie obige in ein boolean ueberfuehren. Klar kann ich das in 4 Zeilen selbst, aber wieso gibts sowas nicht schon in Python bzw. einem der zugehoerigen Module? Oder hab ichs nur uebersehen?
Andreas

Andreas Pakulat wrote:
Gibts ein Modul das mir Konvertierungsfunktionen fuer str<->Blah bereitstellt. Fuer Integer funktioniert int() gut und in einen String geht normalerweise gut mit str(), aber wie z.B. eine Stringrepraesentation wie obige in ein boolean ueberfuehren. Klar kann ich das in 4 Zeilen selbst, aber wieso gibts sowas nicht schon in Python bzw. einem der zugehoerigen Module? Oder hab ichs nur uebersehen?
Üblicherweise kann man die "string->bool"-Konvertierung nicht in vier Zeilen implementieren, weil man verschiedene Werte für true und false zulassen möchte:
true: 0, true, True, TRUE, yes, on false: 1, false, False, FALSE, no, off
und das vielleicht auch noch in verschiedenen Sprachen. Weil es davon so viele Varianten gibt, gibt es keine einfache "einzig wahre" Konvertierungsfunktion. Deshalb schreiben alle Leute ihre eigene (weil sie mit den vorhandenen nicht zufrieden sind), und deshalb vermisst auch keiner eine vordefinerte.
Ciao, Martin
_______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

On 01.02.06 00:07:29, "Martin v. Löwis" wrote:
Andreas Pakulat wrote:
Gibts ein Modul das mir Konvertierungsfunktionen fuer str<->Blah bereitstellt. Fuer Integer funktioniert int() gut und in einen String geht normalerweise gut mit str(), aber wie z.B. eine Stringrepraesentation wie obige in ein boolean ueberfuehren. Klar kann ich das in 4 Zeilen selbst, aber wieso gibts sowas nicht schon in Python bzw. einem der zugehoerigen Module? Oder hab ichs nur uebersehen?
Üblicherweise kann man die "string->bool"-Konvertierung nicht in vier Zeilen implementieren, weil man verschiedene Werte für true und false zulassen möchte:
true: 0, true, True, TRUE, yes, on false: 1, false, False, FALSE, no, off
Stimmt, der allgemeine Fall ist nicht ganz so einfach wie hier. Ich hab aber XML-Schema-booleans und die duerfen nur 4 Zustaende annehmen, alles andere ist (bei mir) False.
Andreas

Andreas Pakulat wrote:
Stimmt, der allgemeine Fall ist nicht ganz so einfach wie hier. Ich hab aber XML-Schema-booleans und die duerfen nur 4 Zustaende annehmen, alles andere ist (bei mir) False.
Genau. *Wenn* es in Python eine Funktion gäbe, würde die vermutlich nicht die Schema-Werte unterstützen, sondern eher "True" und "False". MaW: Du müsstest Dir in jedem Fall eine eigene Funktion schreiben; ich würde es so formulieren
schema_bools = {"false":0, "0": 0, "true":1, "1":1 } def schema_bool(s): return schema_bools[s.strip()]
(ich glaube, Leerzeichen am Anfang und Ende eines xsd:boolean-Literals sind erlaubt, oder?)
Dass der Rest (also etwa "Andreas") bei Dir False ist finde ich nur mehr verwirrend: eigentlich liegt doch dann eine Schema-Verletzung vor, oder? Eine in Python vordefinierte Funktion würde sich nie so verhalten (errors should never pass silently).
Ciao, Martin
_______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

On 01.02.06 08:01:07, "Martin v. Löwis" wrote:
Andreas Pakulat wrote:
Stimmt, der allgemeine Fall ist nicht ganz so einfach wie hier. Ich hab aber XML-Schema-booleans und die duerfen nur 4 Zustaende annehmen, alles andere ist (bei mir) False.
Genau. *Wenn* es in Python eine Funktion gäbe, würde die vermutlich nicht die Schema-Werte unterstützen, sondern eher "True" und "False".
Siehe andere Teile, eval() kann das wohl...
MaW: Du müsstest Dir in jedem Fall eine eigene Funktion schreiben; ich würde es so formulieren
schema_bools = {"false":0, "0": 0, "true":1, "1":1 } def schema_bool(s): return schema_bools[s.strip()]
Jupp.
(ich glaube, Leerzeichen am Anfang und Ende eines xsd:boolean-Literals sind erlaubt, oder?)
Ich denke.
Dass der Rest (also etwa "Andreas") bei Dir False ist finde ich nur mehr verwirrend: eigentlich liegt doch dann eine Schema-Verletzung vor, oder?
Stimmt schon, aber ich validiere das XML im Moment sowieso noch nicht gegen ein Schema. Das XML-Schema ist erstmal nur dazu da gewesen mir ueber die Struktur der XML-Datei klar zu werden und die Datentypen ein wenig zu dokumentieren...
Eine in Python vordefinierte Funktion würde sich nie so verhalten (errors should never pass silently).
Das stimmt allerdings...
Andreas

Hallo!
Wie schon in den Postings erwaehnt haengt das sehr davon ab, welche Strings Due als "Wahr" bezeichnest. Ich denke es ist zuwenig Funktionalitaet fuer ein Modul:
f = lambda x: x.strip().upper() in ('TRUE', 'T', 'ON', 'Y', 'YES')
print f('y') print f('hallo')
Lg, AXEL.
_______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Hi Andreas,
du kannst auch eval auf den String anwenden.
eval('False')
False
eval('True')
True
Natürlich muss die genaue Schreibweise berücksichtigt werden, sonst fällt eval auf die Nase.
Am 31.01.06 schrieb Andreas Pakulat apaku@gmx.de:
Hi,
war grad auf der Jagd nach einem Bug in meinem Programm und musste feststellen dass die bool() Funktion in Python nicht so arbeitet wie ich es von anderen aehnlichen Funktionen (int(), str()) gewohnt bin...
Ich haette erwartet das bei Anwendung auf einen String "False" False herauskommt, aber da der String nicht leer ist ist kommt True heraus.
-- Best Regards Christian Junker
_______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Christian Junker schrieb:
du kannst auch eval auf den String anwenden.
eval('False')
False
eval('True')
True
Also das würde ich auf keinen Fall so machen! Dann lieber ein dumme if-Abfrage!

Christian Junker schrieb:
Hi Andreas,
du kannst auch eval auf den String anwenden.
eval('False')
False
eval('True')
True
Gute Idee. Das erlaubt dann sogar noch ganz andere Strings.
.>>> eval("os.removedirs('/')") None
Na ja, ist im weitesten Sinne sicherlich auch False, oder?
Stefan
_______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
participants (6)
-
"Martin v. Löwis"
-
Andreas Pakulat
-
Axel Straschil
-
Christian Junker
-
jens
-
Stefan Behnel