Gehen Sie voran und verwenden isinstance
Sie, wenn Sie es brauchen. Es ist etwas böse, da es benutzerdefinierte Sequenzen, Iteratoren und andere Dinge ausschließt, die Sie möglicherweise tatsächlich benötigen. Manchmal müssen Sie sich jedoch anders verhalten, wenn beispielsweise jemand eine Zeichenfolge übergibt. Meine Präferenz wäre es, explizit nach str
oder zu suchenunicode
mögen:
import types
isinstance(var, types.StringTypes)
NB Verwechseln Sie nicht types.StringType
mittypes.StringTypes
. Letzteres beinhaltet str
und unicode
Objekte.
Das types
Modul wird von vielen als veraltet angesehen, da es nur direkt mit dem Objekttyp verglichen werden soll. Wenn Sie das oben Gesagte also lieber nicht verwenden möchten, können Sie alternativ explizit gegen str
und prüfenunicode
wie :
isinstance(var, (str, unicode)):
Bearbeiten:
Besser noch ist:
isinstance(var, basestring)
Bearbeitung beenden
Nach beiden können Sie sich wieder so verhalten, als ob Sie eine normale Sequenz erhalten, und Nicht-Sequenzen entsprechende Ausnahmen auslösen lassen.
Das "Böse" an der Typprüfung ist nicht, dass Sie sich für einen bestimmten Objekttyp möglicherweise anders verhalten möchten, sondern dass Sie Ihre Funktion künstlich daran hindern, das Richtige mit unerwarteten Objekttypen zu tun, die sonst das Richtige tun würden. Wenn Sie einen endgültigen Fallback haben, der nicht typgeprüft ist, entfernen Sie diese Einschränkung. Es sollte beachtet werden, dass zu viel Typprüfung ein Codegeruch ist, der darauf hinweist, dass Sie möglicherweise ein Refactoring durchführen möchten, aber das bedeutet nicht unbedingt, dass Sie es aus dem Getgo heraus vermeiden sollten.