[Python-de] Typ-Prüfung

Georg Mischler schorsch at schorsch.com
Mit Sep 17 10:59:29 CEST 2003


Lutz Schröer wrote:

> nachdem Rainer mich einigermaßen überzeugt hat, das man Ausnahmen
> wirklich nur in Ausnahmen nutzen sollte

Man sollte da nicht in Dogmatismus verfallen. In der Praxis hat
es sich (auch aus Performance-Gruenden) bewaehrt, sich in
diejenigen Faellen auf Exceptions zu verlassen, welche "relativ
selten" auftreten. Wenn ein einfacher Vergleich als Ersatz
ausreicht (oder sogar eine einfache Berechnung), dann ist deren
Einsatz aber haeufig wirklich naheliegender.


> Im Kochbuch wird auch
> folgende Variante angeboten:
>
> def isString(s):
>   return isinstance(s, type(''))
>
> Das funktioniert aber erst ab Python 2.0 und auch nicht mit Unicode.

Das funktioniert problemlos auch mit Python 1.5, aber in der
Tat nicht mit Unicode. Wenn du Versionsunabhaengigkeit *und*
Unicode willst, dann koennte folgendes helfen:


  import types

  if hasattr(types, 'UnicodeType'):
      _stypes = (types.StringType, types.UnicodeType)
  else:
      _stypes = (types.StringType,)

  if not hasattr(__builtins__, 'True'):
      True = 1
      False = 0

  def isString(s):
      for t in _stypes:
          if isinstance(s, t): return True
      return False


Die for-Schlaufe ist notwendig, weil isinstance() in 1.5 noch nicht
mit Listen/Tupeln umgehen kann, die musst du also selber behandeln.

Ich behaupte nicht, dass dies das Maximum an Eleganz ist, aber
das sind Kompatibilitaetsloesungen selten. Immerhin sollte es
fuer (fast ;) jeden Python-Entwickler verstaendlich sein.


-schorsch

-- 
Georg Mischler  --  simulations developer  --  schorsch at schorsch com
+schorsch.com+  --  lighting design tools  --  http://www.schorsch.com/