Vá em frente e use isinstance
se precisar. É um tanto ruim, pois exclui sequências personalizadas, iteradores e outras coisas que você realmente pode precisar. No entanto, às vezes você precisa se comportar de maneira diferente se alguém, por exemplo, passa uma string. Minha preferência seria verificar explicitamente str
ou algo unicode
assim:
import types
isinstance(var, types.StringTypes)
NB Não confunda types.StringType
com types.StringTypes
. Este último incorpora str
e unicode
objeta.
O types
módulo é considerado por muitos obsoleto em favor de apenas verificar diretamente o tipo de objeto; portanto, se você preferir não usar o acima, pode alternativamente verificar explicitamente contra str
e unicode
, assim:
isinstance(var, (str, unicode)):
Editar:
Melhor ainda é:
isinstance(var, basestring)
Finalizar edição
Depois de qualquer uma dessas opções, você pode voltar a se comportar como se estivesse obtendo uma sequência normal, permitindo que as não-sequências gerem exceções apropriadas.
Ver o que é "mau" na verificação de tipos não é que você queira se comportar de maneira diferente para um determinado tipo de objeto, é que você restringe artificialmente sua função de fazer a coisa certa com tipos de objetos inesperados que, de outra forma, fariam a coisa certa. Se você tiver um fallback final que não é verificado por tipo, remova essa restrição. Deve-se observar que muita verificação de tipo é um cheiro de código que indica que você pode querer refatorar, mas isso não significa necessariamente que você deve evitá-la do getgo.