Śmiało i użyj, isinstancejeśli potrzebujesz. Jest to trochę złe, ponieważ wyklucza niestandardowe sekwencje, iteratory i inne rzeczy, których możesz potrzebować. Czasami jednak musisz zachowywać się inaczej, jeśli ktoś, na przykład, przejdzie przez łańcuch. Moją preferencją byłoby jawne sprawdzenie strlub unicodepolubienie:
import types
isinstance(var, types.StringTypes)
NB Nie myl się types.StringTypez types.StringTypes. Ten ostatni zawiera stri unicodeobiekty.
typesModuł jest uważany przez wielu za przestarzały na rzecz tylko sprawdzam bezpośrednio przed typu obiektu, więc jeśli nie chcesz korzystać z powyższym, można alternatywnie sprawdzić jawnie przeciw stri unicode, podobnie jak to:
isinstance(var, (str, unicode)):
Edytować:
Jeszcze lepiej jest:
isinstance(var, basestring)
Zakończ edycję
Po którymkolwiek z nich możesz wrócić do zachowywania się, jakbyś otrzymywał normalną sekwencję, pozwalając, by niesekwencje generowały odpowiednie wyjątki.
Zobacz, że „zło” w sprawdzaniu typów nie polega na tym, że możesz chcieć zachowywać się inaczej w odniesieniu do określonego typu obiektu, lecz na tym, że sztucznie ograniczasz swoją funkcję do wykonywania właściwych rzeczy z nieoczekiwanymi typami obiektów, które w przeciwnym razie mogłyby zrobić właściwą rzecz. Jeśli masz ostatnią awarię, która nie jest sprawdzona pod względem typu, usuwasz to ograniczenie. Należy zauważyć, że zbyt wiele sprawdzania typu to zapach kodu wskazujący, że możesz chcieć trochę refaktoryzować, ale to niekoniecznie oznacza, że powinieneś unikać go z getgo.