UnicodeWarning bei Vergleich von Variable mit String

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
bluna
User
Beiträge: 8
Registriert: Dienstag 4. August 2009, 12:54

Hallo,
ich bin gerade dabei ein Programm zu entwerfen, dass ich bei einem Vorstellungsgespräch eventuell vorzeigen möchte und brauche daher dringend mal eure Hilfe ! :wink:

Code: Alles auswählen

    def create_newuserlist(self, listname, firstname, surname, age, phone, sex):
            listname = []
            listname.append((firstname, surname, age, phone, sex))
            print listname
    def on_newentry(self, event):
        firstname = self.editfirstname.GetValue()
        surname = self.editsurname.GetValue()
        age = self.editage.GetValue()
        phone = self.editphone.GetValue()
        sex = self.sex.GetStringSelection()
        if sex == "männlich":
            listname = "Herr " + surname
        else:
            listname = "Frau " + surname

        self.create_newuserlist(listname, firstname, surname, age, phone, sex)
Folgender Fehler tritt auf:

Code: Alles auswählen

Warning (from warnings module):
  File "C:\Users\Kevin\Desktop\projects2010\AdressbuchMai2010_wx.py", line 38
    if sex == "männlich":
UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
[(u'hans', u'petersen', u'21', u'017511111', u'm\xe4nnlich')]
Ich habe bereits google benutzt und habe "UnicodeWarnin: Unicode equal..." eingegeben, man wird auch fündig, aber eine Problemlösung konnte ich nicht herauslesen.

Ich bin sehr dankbar für jeden guten Rat - liegt mir echt am Herzen das Prog bis morgen abend fertig zu stellen.

Mit freundlichen Grüßen,
bluna
sind wir nicht alle ein bisschen... bLuNa !?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Du musst auch Unicode-Literale benutzen:

Code: Alles auswählen

u"männlich"
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Naja, du vergleichst einen Bytestring ("männlich"), mit einem Unicodestring(``sex``), das sagt dir die Fehlermeldung auch ganz deutlich.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
bluna
User
Beiträge: 8
Registriert: Dienstag 4. August 2009, 12:54

Ich habe mich noch nie mit sog. "unicode-literalen" oder etwas ähnlichem beschäftigt.

schreibe ich nun z.b.: u"männlich"
kommt zwar die fehlermeldung nicht mehr, aber wenn ich mir die liste per print ausgeben lasse kommt folgendes:

Code: Alles auswählen

[(u'hans', u'peter', u'21', u'1111', u'm\xe4nnlich')]
ich bin dabei eine art adressbuch zu schreiben und dort sollen noch weitere listen folgen, mit denen ich auch arbeiten möchte. z.b. sollen später diese listen verwendet werden um neue buttons oder labels zu erstellen.

z.b. mit hilfe einer vor-schleife für jeden listeneintrag einen button mit dazugehöriger beschriftung. Kann doch nicht sein, dass ich dann immer ein "u" dort stehen habe.

Gibt es nicht eine Lösung, so dass in der Liste das "u'm" oder "u" nicht erscheint ? oder ist das jetzt schon so der fall, dass das dort zwar steht, aber nicht wenn ich dann mit den listeneinträgen arbeite? weil wenn meine einträge dann nicht mehr "name" sondern "u'm"name"" heißen, kann ich mir vorstellen dass das alles sehr kompliziert wird wenn ich einträge in dictionarys oder listen ansprechen will

oder eine lösung, dass python das automatisch erkennt, indem ich z.b. mir irgendwas runterlade und dann per "import" sozusagen alles automatisch geändert wird :/

hoffe ihr versteht mich.

-edit- der eintrag "männlich" wird ja regelrecht verunstaltet ;( will da nur ein normales "männlich" haben
u'm\xe4nnlich'
sind wir nicht alle ein bisschen... bLuNa !?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Wie immer bei solchen Fragen:
http://wiki.python-forum.de/Von%20Umlau ... 0Encodings
http://wiki.python-forum.de/User%20Grou ... folien.pdf

Ich denke wenn Du das durch hast, siehst Du da klarer :-)
BlackJack

@bluna: Wenn Du das bisher nicht gemacht hast, solltest Du Dich jetzt dringend mit Unicode, Bytes, Kodierungen, und unterschiedlichen Darstellungen von den gleichen Daten beschäftigen. Das ist wichtig.

Wenn Du zum Beispiel eine Liste ausgibst, dann wird das `list`-Exemplar nach einer Zeichenkettendarstellung von sich selbst gefragt. Und bei Listen ist das so implementiert, dass von den enthaltenen Objekten die `repr()`-Darstellung erfragt und verwendet wird. Und die sieht bei `str` und `unicode` so aus, dass alles ausserhalb von ASCII "escaped" wird, also '\xe4' für das 'ä' in der Unicode-Zeichenkette. Die Ausgabe von Listen ist nicht für Endbenutzer gedacht, sondern für Programmierer. Und damit Du als Programmierer sehen kannst, was eine Zeichenkette oder ein Unicode-Objekt *wirklich* enthält, ist es wichtig das zu escapen, damit es nicht wie auch immer von dem Programm was die Anzeige übernimmt, interpretiert wird und andere Zeichen als beabsichtigt, oder gar keine Angezeigt werden.

Wenn Du Unicode-Literale haben willst, musst Du bei Python 2.x ein 'u' davor schreiben. Das ist halt so. Du kannst es Dir bei Zeichenketten ersparen, die nur ASCII enthalten, aber ansonsten musst Du dem Compiler ja irgendwie mitteilen dass Du da keine Bytes haben willst wie sie im Quelltext stehen, sondern ein Unicode-Objekt, das gemäss des Kodierungskommentars zu `unicode` dekodiert werden soll.

Noch zwei Anmerkungen zum eigentlichen Programm:

Das Alter zu speichern ist ungünstig. Das ändert sich ja "ständig", also einmal im Jahr. Das Geburtsdatum macht mehr Sinn. Das ändert sich nicht und man kann das aktuelle Alter daraus errechnen wenn man es denn anzeigen möchte.

Das Geschlecht ist mit männlich und weiblich zu sehr eingeschränkt. Mal davon abgesehen dass es Leute gibt, bei denen das nicht klar ist, entweder biologisch, psychologisch, oder beides, gibt es ja auch juristische Personen, wie Firmen, Vereine und so weiter. “Lieber Herr Hasenzüchterverband,” klingt komisch. ;-)
bluna
User
Beiträge: 8
Registriert: Dienstag 4. August 2009, 12:54

Vielen Dank erst einmal für die schnellen antworten, an alle!

Ich denke mal aus Zeitgründen werde ich wohl darauf verzichten müssen, das Programm vorzustellen, weiß nicht ob ich diesen unicode-"kram" heut noch schaff.

Sprich: es gibt keine andere Lösung als sich da durchzulesen ?! :? Falls doch: mir ist es für heute und morgen erst ein mal egal, was hinter dem ganzen steckt... wenn es erst einmal eine art "automatische codierung" mit hilfe von externen programmen gibt, dann würde mir das sehr helfen, danach lese ich mich fleißig ein ;)

@Blackjack

Das mit dem Alter etc ist schon klar, diente in diesem Fall nur dazu schnell ein Gerüst aufzubauen, denn ich fange gerade erst an mich überhaupt in WX einzuarbeiten. Hatte mal mit Tkinter angefangen, dann aber hier im Forum gesehen, dass viele wx bevorzugen (mit Recht kann ich nur sagen :d )
sind wir nicht alle ein bisschen... bLuNa !?
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Sprich: es gibt keine andere Lösung als sich da durchzulesen ?!
Ja, ist es. Es ist elementar - und eigentlich nicht schwer zu verstehen. :-)

Wenn du Python 2.x nutzt UND nicht nur mit dem ASCII-Zeichensatz hantieren willst - was bei Verwendung deutscher Sprache (äöüß) eher ausscheidet, dann sollte man das verstehen. Macht das Leben leichter. ;-)

Falls die irgendwann mal deine Adressliste auf eine DB schieben willst, dann kommt das Thema so wie so.

Zum Prog: praktische ist es IMHO statt z.B. "männlich" einfach nur ein "m" zu nehmen. Wobei wenn die Frage "sex" kommt ist die Antwort doch eigentlich "ja", "nein" oder "gelegentlich", oder ? ;-)

Gruß, noisefloor
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

bluna hat geschrieben:Sprich: es gibt keine andere Lösung als sich da durchzulesen ?! :?
Das sind absolute Grundlagen, die du können musst. Wenn du darüber nicht Bescheid weisst wirst du sehr schnell Probleme bekommen auch wenn diese erstmal nicht offensichtlich sind.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Mein Tipp für weniger lesen wäre, Python 3.1 zu benutzen, denn dort fällt es schwer, nicht mit "richtigen" Strings zu arbeiten. Doch auch dort muss man sich des Unterschieds zwischen einer Datei auf der Platte, die eine Folge von Bytes in einem Encoding enthält und eines Strings im Speicher bestehen aus Zeichen, die aus dem Encoding gewonnen worden, bewusst sein.

Stefan
Antworten