Como posso verificar se um objeto Python é uma string (regular ou Unicode)?
python
string
types
compatibility
Matt S.
fonte
fonte
Respostas:
Python 2
Use
isinstance(obj, basestring)
para um objeto a testarobj
.Docs .
fonte
Python 2
Para verificar se um objeto
o
é um tipo de string de uma subclasse de um tipo de string:porque ambos
str
eunicode
são subclasses debasestring
.Para verificar se o tipo de
o
é exatamentestr
:Para verificar se
o
é uma instânciastr
ou qualquer subclasse destr
:O exemplo acima também funciona para cadeias de caracteres Unicode, se você substituir
str
porunicode
.No entanto, talvez você não precise fazer nenhuma verificação explícita de tipo. A "digitação do pato" pode atender às suas necessidades. Veja http://docs.python.org/glossary.html#term-duck-typing .
Consulte também Qual é a maneira canônica de verificar o tipo em python?
fonte
basestring
em py2.Python 3
No Python 3.x,
basestring
não está mais disponível, comostr
é o único tipo de string (com a semântica do Python 2.xunicode
).Portanto, a verificação no Python 3.x é apenas:
Isso segue a correção da
2to3
ferramenta de conversão oficial : converterbasestring
parastr
.fonte
Python 2 e 3
(compatível com outras versões)
Se você deseja verificar sem considerar a versão do Python (2.x vs 3.x), use
six
( PyPI ) e seustring_types
atributo:Dentro
six
(um módulo de arquivo único muito leve), basta fazer o seguinte :fonte
future
( PyPI ) para manter o nome:from past.builtins import basestring
basestring
e depois volte parastr
. Por exemplodef is_string(obj): try: return isinstance(obj, basestring) # python 2 except NameError: return isinstance(obj, str) # python 3
Encontrei isso e mais
pythonic
:desde que os objetos de tipo são Singleton, é pode ser usado para fazer a comparar o objeto para o tipo str
fonte
isinstance(obj_to_test, str)
obviamente é para testar o tipo e tem a vantagem de usar o mesmo procedimento que para outros casos não-str.Se alguém quiser ficar longe explícita (e não de verificação de tipo são , provavelmente, a parte mais segura boas razões para ficar longe dele) do protocolo de string para verificação é:
Ele não itera através de um iterável ou iterador, não chama uma lista de cadeias de caracteres como uma string e detecta corretamente uma string como uma string.
Claro que existem desvantagens. Por exemplo,
str(maybe_string)
pode ser um cálculo pesado. Como tantas vezes, a resposta é que depende .EDIT: Como o @Tcll aponta nos comentários, a pergunta realmente pede uma maneira de detectar cadeias unicode e bytestrings. No Python 2, esta resposta falhará, com uma exceção para cadeias unicode que contêm caracteres não ASCII, e no Python 3 retornará
False
para todas as cadeias de bytes.fonte
b = b'test'; r = str(b) == b
ondeb
mantém os mesmos dados questr(b)
mas (sendo um objeto de bytes) não valida como uma sequência.Para verificar se sua variável é algo que você pode usar:
A saída de isistance fornecerá um valor booleano True ou False, para que você possa ajustar adequadamente. Você pode verificar o acrônimo esperado do seu valor usando inicialmente: type (s) Isso retornará o tipo 'str' para que você possa usá-lo na função isistance.
fonte
Eu posso lidar com isso no estilo de digitação de pato, como outros mencionam. Como sei que uma string é realmente uma string? bem, obviamente, convertendo -o em uma string!
Se o arg já for um tipo de cadeia ou unicode, real_word manterá seu valor não modificado. Se o objeto transmitido implementa um
__unicode__
método, isso é usado para obter sua representação unicode. Se o objeto passado não puder ser usado como uma sequência, ounicode
builtin gerará uma exceção.fonte
será True se o seu objeto for realmente um tipo de string. 'str' é uma palavra reservada.
minhas desculpas, a resposta correta é usar 'basestring' em vez de 'str' para incluir também strings unicode - como observado acima por um dos outros respondedores.
fonte
Naquela noite, me deparei com uma situação em que achava que precisaria checar o
str
tipo, mas acabou que não.Minha abordagem para resolver o problema provavelmente funcionará em muitas situações, por isso ofereço-o abaixo caso outras pessoas que estejam lendo esta questão estejam interessadas (somente Python 3).
Alguns testes:
fonte
É simples, use o seguinte código (assumimos que o objeto mencionado seja obj) -
fonte
Você pode testá-lo concatenando com uma sequência vazia:
Editar :
Corrigindo minha resposta após comentários apontando que isso falha nas listas
fonte
Para uma boa abordagem de digitação de pato para curtidas de string que tem o bônus de trabalhar com o Python 2.xe 3.x:
o wisefish estava próximo da digitação do pato antes de mudar para a
isinstance
abordagem, exceto que ele+=
tem um significado diferente para as listas+
.fonte
isalpha
, mas quem sabe que métodos seriam seguros?__str__
método mais igualdade pode realmente ser a única prova de idiota. Mas mesmo isso não é sem ressalvas.try
pode ser mais rápido. Se você espera 99% do tempo, talvez não. Como a diferença de desempenho é mínima, é melhor ser idiomático, a menos que você crie um perfil do seu código e o identifique como realmente lento.from EDX - curso online MITx: 6.00.1x Introdução à ciência da computação e programação usando Python
fonte
str
!