Beste Weg, um den Typ einer Variablen zu überprüfen

Gestern habe ich einige Tests gemacht, um die Art eines Elements aus einer Liste zu identifizieren.

types={"float":float, "int":int, "str":str} try: sql_type = next (k for k,v in types.iteritems() if isinstance (uniqLst[0],v)) except TypeError as Typeerr: print "Type not right: " + str(Typeerr) 

Nun, natürlich ist das Element immer ein String, da die Daten, die die Liste enthält, aus einer Textdatei stammt. Ich habe mich gefragt, was ein guter Weg sein könnte, um die wahre Natur des Elements zu überprüfen. Sollten Sie wirklich einen try/except Lösung, wie:

 def check_type(element): try: int(element) return 'int' except: pass try: float(element) return 'float' except: pass try: str(element) return 'str' except: return 'error type' 

Was ist mit re.compile ? (Und dann etwas wie ('[0-9]+') ) scheint mir nicht sehr praktisch zu sein. Jeder Rat wird sehr geschätzt!

Beifall, LarsVegas

3 Solutions collect form web for “Beste Weg, um den Typ einer Variablen zu überprüfen”

Basierend auf deinem Kommentar zur Antwort von ikanobori kannst du nach folgenden String-Methoden suchen:

 str.isalnum() 

Geben Sie true zurück, wenn alle Zeichen in der Zeichenfolge alphanumerisch sind und es mindestens ein Zeichen gibt, andernfalls false. Ein Buchstabe c ist alphanumerisch, wenn einer der folgenden Rücksendungen True: c.isalpha (), c.isdecimal (), c.isdigit () oder c.isnumeric ().

 str.isalpha() 

Geben Sie true zurück, wenn alle Zeichen in der Zeichenfolge alphabetisch sind und es mindestens ein Zeichen gibt, andernfalls false. Alphabetische Zeichen sind jene Zeichen, die in der Unicode-Zeichendatenbank als "Letter" definiert sind, dh diejenigen, deren allgemeine Kategorie-Eigenschaft eine von "Lm", "Lt", "Lu", "Ll" oder "Lo" ist. Beachten Sie, dass sich dies von der im Unicode-Standard definierten "Alphabetischen" Eigenschaft unterscheidet.

 str.isdecimal() 

Geben Sie true zurück, wenn alle Zeichen in der Zeichenfolge Dezimalzeichen sind und es mindestens ein Zeichen gibt, andernfalls false. Dezimalzeichen sind solche aus der allgemeinen Kategorie "Nd". Diese Kategorie enthält Ziffernzeichen und alle Zeichen, die zur Bildung von Dezimal-Radix-Nummern verwendet werden können, zB U + 0660, ARABIC-INDIC DIGIT ZERO.

 str.isdigit() 

Rückkehr true, wenn alle Zeichen in der Zeichenfolge Ziffern sind und es mindestens ein Zeichen gibt, sonst false. Ziffern enthalten Dezimalzeichen und Ziffern, die eine spezielle Handhabung benötigen, z. B. die Kompatibilitäts-Hochzeichen. Formativ ist eine Ziffer ein Zeichen, das den Eigenschaftswert Numeric_Type = Digit oder Numeric_Type = Decimal hat.

 str.isidentifier() 

Geben Sie true zurück, wenn die Zeichenfolge eine gültige Kennung gemäß der Sprachdefinition, Abschnitt Identifikatoren und Schlüsselwörter ist.

 str.islower() 

Gib wahr, wenn alle gedeckten Zeichen in der Zeichenkette Kleinbuchstaben sind und es mindestens ein gehülltes Zeichen gibt, andernfalls falsch. Gedeckte Charaktere sind diejenigen mit allgemeiner Kategorie Eigenschaft, die eine von "Lu", "Ll" oder "Lt" und Kleinbuchstaben sind diejenigen mit allgemeinen Kategorie Eigenschaft "Ll".

 str.isnumeric() 

Geben Sie true zurück, wenn alle Zeichen in der Zeichenfolge numerische Zeichen sind und es mindestens ein Zeichen gibt, andernfalls false. Numerische Zeichen sind Ziffernzeichen und alle Zeichen, die die Unicode-Numerische Wert-Eigenschaft haben, zB U + 2155, VULGAR FRACTION ONE FIFTH. Formell sind numerische Zeichen diejenigen mit dem Eigenschaftswert Numeric_Type = Digit, Numeric_Type = Decimal oder Numeric_Type = Numeric.

 str.isprintable() 

Geben Sie true zurück, wenn alle Zeichen in der Zeichenfolge gedruckt sind oder der String leer ist, andernfalls false. Nicht druckbare Zeichen sind jene Zeichen, die in der Unicode-Zeichendatenbank als "Andere" oder "Separator" definiert sind, mit Ausnahme des ASCII-Leerzeichens (0x20), der als druckfähig angesehen wird. (Beachten Sie, dass druckbare Zeichen in diesem Kontext diejenigen sind, die nicht entkommen sollten, wenn repr () auf einen String aufgerufen wird. Es hat keinen Einfluss auf die Behandlung von Zeichenfolgen, die an sys.stdout oder sys.stderr geschrieben wurden.)

 str.isspace() 

Gib wahr, wenn es nur Leerzeichen in der Zeichenfolge gibt und es gibt mindestens ein Zeichen, falsch anders. Whitespace-Zeichen sind jene Zeichen, die in der Unicode-Zeichendatenbank als "Other" oder "Separator" definiert sind und diejenigen mit bidirektionaler Eigenschaft eine von "WS", "B" oder "S" sind.

 str.istitle() 

Geben Sie true zurück, wenn die Zeichenfolge eine markierte Zeichenfolge ist und es mindestens ein Zeichen gibt, z. B. Großbuchstaben dürfen nur ungekürzten Zeichen und Kleinbuchstaben nur eingegeben werden. Rückkehr false sonst.

 str.isupper() 

Gib wahr, wenn alle gedeckten Zeichen in der Zeichenkette Großbuchstaben sind und es mindestens ein gehobeltes Zeichen gibt, andernfalls falsch. Gedeckte Charaktere sind diejenigen mit allgemeiner Kategorie Eigenschaft, die eine von "Lu", "Ll" oder "Lt" und Großbuchstaben sind die mit der allgemeinen Kategorie Eigenschaft "Lu".

Es ist stark entmutigt, die Typprüfung in Python zu verwenden. Warum musst du die Typen kennen?

Python verwendet Enten-Typing, was bedeutet, dass ich meine eigene Unterklasse des Integer-Objekts erstellen kann, das sich genau so verhält, dass es nur eine Instanz von 'type int' ist, die dein Typ-Checking-Abenteuer besiegen würde.

Die Idee ist, ein Objekt in der Art und Weise zu verwenden, wie du es benutzen willst und wenn das scheitert, eine Ausnahme zu erheben, so geben Sie sich selbst und eventuell andere Kodierer, die mit Ihrem Code arbeiten, dass viel mehr Freiheit 🙂

@ Weetus Antwort ist ein großer Überblick, wie Python- String-Prädikate den Unicode-allgemeinen Kategorieneigenschaften entsprechen .

Als Übung habe ich versucht, ein Programm zu schreiben, um mich herauszufinden, welches String Prädikat (zB isdigit ) den Charaktereigenschaften entspricht. So öffnete ich Unicode-Charakter-Kategorien und füllte ein Wörterbuch mit Schlüsseln, die 2-Buchstaben-Kategorien ( 'Lt' ) und Wert als Beispiel Unicode-Zeichen ( u'Dž' ), dann schrieb ein Programm, um Korrespondenz zwischen String-Prädikaten und Zeichen-Eigenschaften zu erhalten. Ich habe Python 3 verwendet, weil Python 2 einen mysteriösen Unicode-Bug hatte (ich bin froh, wenn du darauf hinweist, warum Code unten in Python 2 falsch funktioniert) .

 d = { 'Cc': u'', 'LC': None, 'Pc': u'_', 'Sc': u'$', 'Cf': u'𑂽', 'Ll': u'a', 'Pd': u'-', 'Sk': u'^', 'Cn': None, 'Lm': u'ʰ', 'Pe': u')', 'Sm': u'+', 'Co': u'', 'Lo': u'ª', 'Pf': u'»', 'So': u'¦', 'Cs': u'⠀', 'Lt': u'Dž', 'Pi': u'«', 'Lu': u'A', 'Po': u'!', 'Ps': u'(', 'Mc': u'ः', 'Nd': u'0', 'Zl': u' ', 'Me': u'҈', 'Nl': u'ᛮ', 'Zp': u' ', 'Mn': u'̀', 'No': u'²', 'Zs': u' ' } # Zl and Zp have invisible characters that break Markdown's code blocks 
 methods = ['isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'isnumeric', 'isdecimal'] dl = {method: [code for code, character in d.items() if character and getattr(character, method)()] for method in methods} 

Ergebnis ist unten. ZB ch.isdigit() wird True wenn ch entweder No oder Nd Unicode-Eigenschaft hat.

 >>> from pprint import pprint # pretty printing >>> pprint(dl) {'isalnum': ['No', 'Nd', 'Nl', 'Lu', 'Lt', 'Lo', 'Lm', 'Ll'], 'isalpha': ['Lu', 'Lt', 'Lo', 'Lm', 'Ll'], 'isdecimal': ['Nd'], 'isdigit': ['No', 'Nd'], 'islower': ['Lo', 'Lm', 'Ll'], 'isnumeric': ['No', 'Nd', 'Nl'], 'isspace': ['Zp', 'Zs', 'Zl'], 'istitle': ['Lu', 'Lt'], 'isupper': ['Lu']} 

Für mehr intelligente Operationen mit Unicode-Zeichen-Datenbank, siehe Python-Bibliothek Unicodedata .

Referenzen:

  • Listenverständnisse
  • Dict Verständnis
  • dict.items()
  • getattr
  • pprint bibliothek
Python ist die beste Programmiersprache der Welt.