Einfach C# imitieren
In C# gibt es zwei verschiedene Funktionen, die das Parsen von skalaren Werten übernehmen:
- Float.Parse()
- Float.TryParse()
float.parse():
def parse(string):
try:
return float(string)
except Exception:
throw TypeError
Hinweis: Falls Sie sich fragen, warum ich die Ausnahme in einen TypeError geändert habe, Hier ist die Dokumentation .
float.try_parse():
def try_parse(string, fail=None):
try:
return float(string)
except Exception:
return fail;
Hinweis: Sie sollten nicht den booleschen Wert "False" zurückgeben, da dies immer noch ein Werttyp ist. None ist besser, weil es einen Fehler anzeigt. Wenn Sie etwas anderes wollen, können Sie den Parameter "fail" natürlich in den gewünschten Wert ändern.
Um float um die Methoden 'parse()' und 'try_parse()' zu erweitern, müssen Sie die Klasse 'float' mit einem Monkeypatch versehen, um diese Methoden hinzuzufügen.
Wenn Sie bereits existierende Funktionen respektieren wollen, sollte der Code etwa so aussehen:
def monkey_patch():
if(!hasattr(float, 'parse')):
float.parse = parse
if(!hasattr(float, 'try_parse')):
float.try_parse = try_parse
Nebenbemerkung: Ich persönlich ziehe es vor, es Monkey Punching zu nennen, weil es sich anfühlt, als würde ich die Sprache missbrauchen, wenn ich das tue, aber das ist Geschmackssache.
Verwendung:
float.parse('giggity') // throws TypeException
float.parse('54.3') // returns the scalar value 54.3
float.tryParse('twank') // returns None
float.tryParse('32.2') // returns the scalar value 32.2
Und der große Weise Pythonas sagte zum Heiligen Sharpisus: "Alles, was du kannst, kann ich besser; ich kann alles besser machen als du."
101 Stimmen
Was ist falsch an Ihrer derzeitigen Lösung? Sie ist kurz, schnell und lesbar.
7 Stimmen
Und Sie müssen nicht nur True oder False zurückgeben. Sie können stattdessen den Wert entsprechend modifiziert zurückgeben - zum Beispiel könnten Sie dies verwenden, um Nicht-Zahlen in Anführungszeichen zu setzen.
10 Stimmen
Wäre es nicht besser, im Falle einer erfolgreichen Konvertierung das Ergebnis von float(s) zurückzugeben? Sie haben immer noch die Erfolgsprüfung (Ergebnis ist False) und Sie haben die Umwandlung, die Sie wahrscheinlich sowieso wollen.
0 Stimmen
Thruston - Ich verstehe, was Sie meinen, aber dann ist die Prüfung nicht mehr so einfach.
12 Stimmen
Auch wenn diese Frage schon älter ist, wollte ich nur sagen, dass dies ein eleganter Weg ist, der dokumentiert ist als EAFP . Das ist wahrscheinlich die beste Lösung für diese Art von Problem.
2 Stimmen
Das scheint in Ordnung zu sein, es sei denn, Sie validieren die Eingaben eines Benutzers, da locale.atoi("0,1,00") 100.... ergibt.
0 Stimmen
Sehr nützliche Funktion. Darüber hinaus, wenn Sie Raum, wie 1e + 2, etc. zulassen wollen, dann muss diese Funktion geändert werden.
0 Stimmen
Wenn Sie nicht wissen, ob es sich bei dem Eingabewert um eine Zeichenkette handelt, können Sie auch einen TypeError
2 Stimmen
pythoncentral.io/ würde helfen.
0 Stimmen
Gibt das Ergebnis von
float(s)
bei Erfolg, oderNone
, bei Fail. Dann erhalten Sie das True/False-Verhalten und können das Ergebnis direkt verwenden.0 Stimmen
Verwandt: Float/Double-Wert extrahieren
10 Stimmen
Nicht gibt das Ergebnis von float(s) oder None bei Fail zurück. Wenn Sie es dann als
x = float('0.00'); if x: use_float(x);
haben Sie jetzt einen Fehler in Ihrem Code. Wahrheitsgemäße Werte sind der Grund dafür, dass diese Funktionen eine Ausnahme auslösen und nicht zurückgebenNone
an erster Stelle. Eine bessere Lösung ist es, die Hilfsfunktion zu vermeiden und den Aufruf von float in einetry catch
wenn Sie es benutzen wollen.0 Stimmen
Dies ist ein Teil des Problems, das in dem Beitrag stackoverflow.com/questions/36903462/adding-numbers-in-a-string/
4 Stimmen
Achtung: Das Snippet sagt aus, dass jede Objekt, das automatisch wirft zu float ist eine Zahl, und das könnte irreführend sein. Zum Beispiel kann eine einfache bool ist eine Zahl, da float(True) eine gültige 1,0 zurückgibt.
0 Stimmen
Nicht langsam. int(s) oder float(s) ist wahrscheinlich fast so schnell wie das, was der Python-Interpreter für solche Dinge verwendet und kann sogar etwas C-Code darunter haben. In [17]: time_it(int, '333', count=1) Out[17]: 4.0531158447265625e-06 Ziemlich schnell.
0 Stimmen
Wahrscheinlich möchten Sie den ValueError-Teil loswerden, da dieser sonst eine Ausnahme auslöst, wenn er eine Liste / ein Diktat als Eingabe erhält
0 Stimmen
@Colonel Panic es ist auch langsam
2 Stimmen
Der langsame Teil ist NICHT der Float(a). Der langsame Teil ist die Ausnahme throw/catch. Wie jeder gute Programmierer weiß: VERWENDEN SIE NIEMALS AUSNAHMEN FÜR DEN NORMALEN CODE-WEG. Der OP hat das nicht spezifiziert, also denke ich, dass wir davon ausgehen sollten, dass nicht-numerische Eingaben "normal" für diese Funktion sind. Ist es in Python üblich, Ausnahmen als Teil des normalen Codeflusses zu verwenden? @SamanthaAtkins
0 Stimmen
Warum nicht folgen lazy Überprüfung Muster? davon ausgehen, dass das Objekt ein Float ist und versuchen Sie die Operation und fangen eine Ausnahme, protokollieren Sie es und dann gießen Sie es zu Float und reattempt.