Dies kann nicht auf zuverlässige Weise geschehen, und das liegt nicht an den Beschränkungen von Python oder einer anderen Programmiersprache. Ein Mensch könnte dies nicht auf vorhersehbare Weise tun, ohne zu raten und ein paar Regeln zu befolgen (gewöhnlich genannt Heuristik wenn sie in diesem Zusammenhang verwendet werden).
Also entwerfen wir zunächst ein paar Heuristiken und kodieren sie dann in Python. Folgende Dinge sind zu beachten:
- Alle Werte sind gültige Zeichenketten, das wissen wir, denn das ist die Grundlage unseres Problems, so dass es keinen Sinn hat, dies überhaupt zu überprüfen. Wir sollten alles andere überprüfen, was wir können, was auch immer durchfällt, können wir einfach als eine Zeichenfolge verlassen.
- Datumsangaben sind am ehesten zu überprüfen, wenn sie in vorhersehbarer Weise formatiert sind, wie z. B.
[YYYY]-[MM]-[DD].
( ISO ISO 8601 Datumsformat ) sind sie leicht von anderen Textabschnitten zu unterscheiden, die Zahlen enthalten. Wenn die Daten in einem Format sind, das nur Zahlen enthält, wie YYYYMMDD
dann sind wir aufgeschmissen, da diese Daten nicht von gewöhnlichen Zahlen zu unterscheiden sind.
- Als Nächstes werden wir uns mit Ganzzahlen beschäftigen, da alle Ganzzahlen gültige Gleitkommazahlen sind, aber nicht alle Gleitkommazahlen gültige Ganzzahlen sind. Wir könnten einfach prüfen, ob der Text Ziffern enthält (oder Ziffern und die Buchstaben A-F, wenn hexadezimale Zahlen möglich sind), in diesem Fall wird der Wert als Ganzzahl behandelt.
- Fließkommazahlen wären die nächste Möglichkeit, da es sich um Zahlen mit einer gewissen Formatierung (Dezimalpunkt) handelt. Es ist leicht zu erkennen
3.14159265
als Fließkommazahl. Allerdings 5.0
die einfach geschrieben werden kann als 5
ist ebenfalls eine gültige Gleitkommazahl, die jedoch in den vorangegangenen Schritten abgefangen und nicht als Gleitkommazahl erkannt worden wäre, selbst wenn dies beabsichtigt gewesen wäre.
- Alle Werte, die nicht konvertiert werden, können als Zeichenketten behandelt werden.
Aufgrund der oben erwähnten möglichen Überschneidungen ein solches System kann nie 100% zuverlässig sein . Auch jeder neue Datentyp, den Sie unterstützen müssen (z. B. komplexe Zahlen), würde eine eigene Heuristik erfordern und müsste an der am besten geeigneten Stelle in der Prüfkette platziert werden. Je wahrscheinlicher es ist, dass eine Prüfung nur dem gewünschten Datentyp entspricht, desto weiter oben in der Kette sollte sie stehen.
Die meisten der oben erwähnten Heuristiken werden von Python für uns übernommen, wir müssen nur noch entscheiden, in welcher Reihenfolge wir sie anwenden wollen:
from datetime import datetime
heuristics = (lambda value: datetime.strptime(value, "%Y-%m-%d"),
int, float)
def convert(value):
for type in heuristics:
try:
return type(value)
except ValueError:
continue
# All other heuristics failed it is a string
return value
values = ['3.14159265', '2010-01-20', '16', 'some words']
for value in values:
converted_value = convert(value)
print converted_value, type(converted_value)
Es wird Folgendes ausgegeben:
3.14159265 <type 'float'>
2010-01-20 00:00:00 <type 'datetime.datetime'>
16 <type 'int'>
some words <type 'str'>