Anfängerproblem bei Usereingaben

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.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Bei so etwas einfachen kann man auch offensichtlich keine Fehler machen.

Code: Alles auswählen

>>> isint("- 1")
False
>>> int("- 1")
-1
>>> isint(" -1")
False
>>> int(" -1")
-1
>>> isint(" 1")
False
>>> int(" 1")
1
Das Leben ist wie ein Tennisball.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Inzwischen wird es wirklich einfacher, ``int()`` direkt aufzurufen.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
problembär

Hallo nochmal,

hab' noch einmal drüber nachgedacht. Wie oben schon gesagt, müßte man am besten wohl einen regulären Ausdruck nehmen. In sowas sind ja die Perl-Leute Spezialisten, und sie haben sich auch damit befaßt, sogar mehrfach.

Das Ergebnis war aber immer noch nicht so, wie ich's wollte, deshalb hab' ich auch noch einen eigenen regulären Ausdruck (für float) geschrieben (der aber nicht diese "3E+23"-Sachen erkennt):

Code: Alles auswählen

#!/usr/bin/env python
#-*- coding: iso-8859-1 -*-

import re

a = ('','foo 30','.20','20.',',20','20,','1.3E2', '2..3','++3','2.3.',
     '10','..3','0','100','100.23','1,100.23','-3E-2', "- 15.3", " 24.32   ",    "+ 32. ",         " - 21,23 ", "-.", "-")

patobj = re.compile("^ *[+-]? *(\d+|\d+\.\d*|\d*\.\d+) *$")

for i in a:

    if patobj.search(i):
        print i + " is True."
    else:
        print i + " is False."

    try:
        b = float(i)
        print i + " is Good."
    except:
        print i + " is Bad."
    print
Bestimmt entdeckt ihr jetzt wieder noch ein paar Schwächen.

Ist wohl ein bekanntes, aber gar nicht so einfaches Problem.

Viele Grüße
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

problembär hat geschrieben:Wie oben schon gesagt, müßte man am besten wohl einen regulären Ausdruck nehmen.
Wieso auch einfach wenn es auch kompliziert und unvollständig geht?
problembär

Weil zumindest in Perl:
>>USe an eval, it's correct (by definition) and avoids possible errors
>QA Editors note: This solution doesn't work as described.
Außerdem lasse ich meine Anwendung sich wenn möglich nicht vorsätzlich aufhängen (try: ... except: ....), vor allem wenn ich meinen Code auch mal in andere Sprachen bringen will, die das nicht unterstützen.
Zuletzt geändert von problembär am Mittwoch 22. Juli 2009, 17:31, insgesamt 1-mal geändert.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Zwischen eval, und int/float/complex besteht allerdings ein kleiner Unterschied.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

problembär hat geschrieben:Außerdem lasse ich meine Anwendung sich wenn möglich nicht vorsätzlich aufhängen (try: ... except: ....), vor allem wenn ich meinen Code auch mal in andere Sprachen bringen will, die das nicht unterstützen.
try-except ist bei Python allerdings vollkommen üblich und sogar ausdrücklich erwünscht (Stichwort: EAFP).

Das Umwandeln in eine andere Sprache ist ein wirklich sinnloses Argument. Jede Sprache hat ihre Eigenheiten und Paradigmen, welche auch beachtet werden sollten. Einfach kopieren macht keinen Sinn. Mit deinem Ansatz provozierst du zusätzlich noch Fehler. Zu schlechtem Code kommt dann noch ein fehlerhaftes Programm.
Das Leben ist wie ein Tennisball.
problembär

und unvollständig
Ist soweit nicht unvollständig. Bei den Leerzeichen war ich nur etwas großzügig. Das heißt, vor der Umwandlung in float muß man noch die Leerzeichen rausziehen:

Code: Alles auswählen

#!/usr/bin/env python
#-*- coding: iso-8859-1 -*-

import re

a = ('','foo 30','.20','20.',',20','20,','1.3E2', '2..3','++3','2.3.',
     '10','..3','0','100','100.23','1,100.23','-3E-2', "- 15.3", " 24.32   ",    "+ 32. ",         " - 21,23 ", "-.", "-")

patobj = re.compile("^ *[+-]? *(\d+|\d+\.\d*|\d*\.\d+) *$")

for i in a:

    if patobj.search(i):
        print i + " is True."
        i = i.replace(" ", "")
        i = float(i)
        print "Type of i is now: " + str(type(i))
    else:
        print i + " is False."
    print
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Trotzdem ist dein Code immer noch unvollständig, was z.B. 1e5 angeht.

Es ist ganz falsch, das potentielle Auslösen einer Exception als "aufhängen" zu bezeichnen. Exceptions sind eigentlich in allen Sprachen, die sie unterstützen, und in Python ganz besonders eben nicht so "außergewöhnlich", wie der Name vermuten ließe. Sie sind ein Sprachelement wie jedes andere, und werden z.B. auch ganz regulär verwendet, um das Ende eines Iterators zu signalisieren - jede "for"-Schleife, die du verwendest, verarbeitet Exceptions.

Zu den anderen Sprachen hat EyDu schon alles gesagt.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Schreiben wir in allen Sprachen Assembler... (abgesehen davon dass das gar nicht geht, weil es kaum ein Sprachelement gibt, dass wirklich in jeder Sprache vorkommt)

@birkenfeld: du solltest mal deine Signatur aktualisieren :)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

problembär hat geschrieben:Ist soweit nicht unvollständig.
Nur gut, dass niemand Tabs benutzt :wink:
Das Leben ist wie ein Tennisball.
Antworten