Como verificar se o tipo de uma variável é string?

766

Existe uma maneira de verificar se o tipo de uma variável em python é a string, como:

isinstance(x,int);

para valores inteiros?

c_pleaseUpvote
fonte
11
Leitura obrigatória em isinstance se você estiver aprendendo python canonical.org/~kragen/isinstance .
Whaley
Cuidado com ints desde então isinstance(True, int) is True.
Albert Tugushev 17/10/1919
isinstance(x,str)está correto no Python 3 (str é um tipo básico).
MasterControlProgram

Respostas:

1139

No Python 2.x, você faria

isinstance(s, basestring)

basestringé a superclasse abstrata de stre unicode. Pode ser usado para testar se um objeto é uma instância de strou unicode.


No Python 3.x, o teste correto é

isinstance(s, str)

A bytesclasse não é considerada um tipo de string no Python 3.

Sven Marnach
fonte
10
@Yarin: Não. Mas isso não importa, porque o Python 3.x não é compatível com o Python 2.x.
Netcoder
2
Descobri que isinstance (s, str) funciona com py27, testado em: Python 2.7.5 (padrão, 25 de agosto de 2013, 00:04:04) [Apple LLVM 5.0 compatível com GCC 4.2.1 (clang-500.0.68)] em darwin.
kakyo
25
@kakyo: O problema é que ele vai perder unicodeobjetos, que também devem ser considerados strings. Tanto o tipo strquanto o tipo unicodetêm a classe base comum basestring, e é isso que você deseja verificar.
Sven Marnach
7
@ Yarin, se você estiver portando algo de 2.x para 3.x, sempre poderá atribuir basestring = str.
Jack
9
@AdamErickson Para compatibilidade com o que exatamente? Isso não ajuda na compatibilidade com o Python 3, já que não existe unicodeno Python 3. Minha recomendação de compatibilidade entre o Python 2 e 3 é usar a biblioteca "six". (Especificamente isintance(s, six.string_types)neste caso)
Sven Marnach 12/08
222

Sei que esse é um tópico antigo, mas sendo o primeiro mostrado no google e como não encontro nenhuma resposta satisfatória, deixarei aqui para referência futura:

six é uma biblioteca de compatibilidade Python 2 e 3 que já cobre esse problema. Você pode fazer algo assim:

import six

if isinstance(value, six.string_types):
    pass # It's a string !!

Inspecionando o código, é isso que você encontra:

import sys

PY3 = sys.version_info[0] == 3

if PY3:
    string_types = str,
else:
    string_types = basestring,
André Fratelli
fonte
4
Por exemplo, para um liner:, value_is_string = isinstance(value, str if sys.version_info[0] >= 3 else basestring)onde >=assume que qualquer Python 4+ eventual mantém a strclasse raiz para strings.
Marillion Pi 22/10/16
64

No Python 3.x ou Python 2.7.6

if type(x) == str:
Texom512
fonte
10
Eu gosto da elegância de "if type (x) in (str, unicode):", mas vejo o PyLint sinalizar como "unidiomatic".
eukras
15
A comparação de tipos com ==é explicitamente desencorajada pelo PEP8 e possui várias desvantagens além de ser considerada "unidiomatic", por exemplo, não detecta instâncias de subclasses de str, que também devem ser consideradas seqüências de caracteres. Se você realmente deseja verificar exatamente o tipo stre excluir subclasses explicitamente, use type(x) is str.
Sven Marnach 28/10
17

você pode fazer:

var = 1
if type(var) == int:
   print('your variable is an integer')

ou:

var2 = 'this is variable #2'
if type(var2) == str:
    print('your variable is a string')
else:
    print('your variable IS NOT a string')

espero que isto ajude!

F. Taylor
fonte
11

Edite com base na melhor resposta abaixo. Desça cerca de 3 respostas e descubra a frescura da base.

Resposta antiga: Cuidado com as strings unicode, que você pode obter de vários lugares, incluindo todas as chamadas COM no Windows.

if isinstance(target, str) or isinstance(target, unicode):
Wade Hatler
fonte
1
Boa pegada. Eu não sabia sobre basestring. É mencionado cerca de 3 posts abaixo e parece uma resposta melhor.
Wade Hatler,
6
isinstance()também usa uma tupla como segundo argumento. Então, mesmo basestringque não existisse, você poderia apenas usar isinstance(target, (str, unicode)).
Martijn Pieters
3
No python 3.5.1, unicodenão parece estar definido:NameError: name 'unicode' is not defined
Eric Hu
11

Como basestringnão está definido no Python3, esse pequeno truque pode ajudar a tornar o código compatível:

try: # check whether python knows about 'basestring'
   basestring
except NameError: # no, it doesn't (it's Python3); use 'str' instead
   basestring=str

Depois disso, você pode executar o seguinte teste no Python2 e Python3

isinstance(myvar, basestring)
umläute
fonte
4
Ou se você quiser pegar strings de bytes também:basestring = (str, bytes)
Mark Ransom
10

Python 2/3, incluindo unicode

from __future__ import unicode_literals
from builtins import str  #  pip install future
isinstance('asdf', str)   #  True
isinstance(u'asdf', str)  #  True

http://python-future.org/overview.html

crizCraig
fonte
1
Muito obrigado! Existem dezenas de respostas diferentes na Internet, mas a única boa é essa. A primeira linha faz type('foo')ser unicodepor padrão no python 2, e a segunda faz strser instância de unicode. Thoses torna o código válido no Python 2 e 3. Obrigado novamente!
Narann ​​8/08/19
9

Também quero observar que, se você quiser verificar se o tipo de uma variável é um tipo específico, você pode comparar o tipo da variável com o tipo de um objeto conhecido.

Para string, você pode usar este

type(s) == type('')
Daniil Grankin
fonte
7
Esta é uma maneira terrível e terrível de digitar check-in python. E se outra classe herdar str? E as strings unicode, que nem herdam da str2.x? Use isinstance(s, basestring)no 2.x ou isinstance(s, str)no 3.x.
Jack
1
@ Jack, por favor, leia a pergunta e observe também que não escrevo que é a melhor maneira, apenas outra maneira.
Daniil Grankin
9
Essa é uma péssima idéia por três razões: isinstance()permite subclasses (que também são strings, apenas especializadas), a type('')chamada extra é redundante quando você pode simplesmente usar stre os tipos são singletons, por isso type(s) is strserá um teste mais eficiente.
Martijn Pieters
8

Muitas boas sugestões são fornecidas por outras pessoas aqui, mas não vejo um bom resumo entre plataformas. A seguir, deve ser uma boa introdução para qualquer programa Python:

def isstring(s):
    # if we use Python 3
    if (sys.version_info[0] >= 3):
        return isinstance(s, str)
    # we use Python 2
    return isinstance(s, basestring)

Nesta função, usamos isinstance(object, classinfo)para ver se nossa entrada é a strem Python 3 ou a basestringem Python 2.

duanev
fonte
1
Isso provavelmente será interrompido no Python 4, considere >=pelo menos.
Thakis
2
seja mais limpo para verificar se existem six.string_types ou six.text_type
daonb 3/17
A @daonb importar um módulo inteiro apenas para fazer um teste de uma linha é o pensamento que causa árvores de dependência loucas e inchaço grave, arruinando o que deve ser algo pequeno, pequeno e simples. É a sua chamada é claro, mas apenas say'n ...
duanev
@duanev, se você está preocupado com a compatibilidade com o Python 2/3, é melhor usar seis no projeto de qualquer maneira. Seis também é um arquivo único, portanto, árvores de dependência / inchaço não são um problema aqui.
MoxieBall
7

Maneira alternativa para Python 2, sem usar a cadeia de base:

isinstance(s, (str, unicode))

Mas ainda não funcionará no Python 3, pois unicodenão está definido (no Python 3).

yprez
fonte
7

Assim,

Você tem várias opções para verificar se sua variável é string ou não:

a = "my string"
type(a) == str # first 
a.__class__ == str # second
isinstance(a, str) # third
str(a) == a # forth
type(a) == type('') # fifth

Esta ordem é para fins.

PatNowak
fonte
5
a = '1000' # also tested for 'abc100', 'a100bc', '100abc'

isinstance(a, str) or isinstance(a, unicode)

retorna True

type(a) in [str, unicode]

retorna True

be_good_do_good
fonte
Para Python 2.7.12 eu tive que remover o citações: tipo (a) em [str, unicode]
Adam Erickson
4

Aqui está minha resposta para oferecer suporte ao Python 2 e Python 3, juntamente com estes requisitos:

  • Escrito em código Py3 com o mínimo de código compatível Py2.
  • Remova o código compatível Py2 posteriormente sem interrupção. Ou seja, apenas para exclusão, nenhuma modificação no código Py3.
  • Evite usar sixou um módulo compatível semelhante, pois eles tendem a esconder o que está tentando ser alcançado.
  • À prova de futuro para um potencial Py4.

import sys
PY2 = sys.version_info.major == 2

# Check if string (lenient for byte-strings on Py2):
isinstance('abc', basestring if PY2 else str)

# Check if strictly a string (unicode-string):
isinstance('abc', unicode if PY2 else str)

# Check if either string (unicode-string) or byte-string:
isinstance('abc', basestring if PY2 else (str, bytes))

# Check for byte-string (Py3 and Py2.7):
isinstance('abc', bytes)
Cas
fonte
1

Se você não deseja depender de bibliotecas externas, isso funciona tanto para o Python 2.7+ quanto para o Python 3 ( http://ideone.com/uB4Kdc ):

# your code goes here
s = ["test"];
#s = "test";
isString = False;

if(isinstance(s, str)):
    isString = True;
try:
    if(isinstance(s, basestring)):
        isString = True;
except NameError:
    pass;

if(isString):
    print("String");
else:
    print("Not String");
mPrinC
fonte
1

Você pode simplesmente usar a função isinstance para garantir que os dados de entrada sejam de formato string ou unicode . Os exemplos abaixo ajudarão você a entender facilmente.

>>> isinstance('my string', str)
True
>>> isinstance(12, str)
False
>>> isinstance('my string', unicode)
False
>>> isinstance(u'my string',  unicode)
True
Hassan Mehmood
fonte
-3
s = '123'
issubclass(s.__class__, str)
vadim vaduxa
fonte
-6

É assim que eu faço:

if type(x) == type(str()):
Do utilizador
fonte
4
type(str())é uma maneira muito indireta de dizer str. Os tipos são singletons, portanto, type(x) is stré mais eficiente. isinstance()deve ser usado, a menos que você tenha boas razões para ignorar subclasses de str.
Martijn Pieters
se o tipo (x) for str:
shaurya uppal
-7

Eu tenho visto:

hasattr(s, 'endswith') 
dente rápido
fonte
-13
>>> thing = 'foo'
>>> type(thing).__name__ == 'str' or type(thing).__name__ == 'unicode'
True
Richard Urban
fonte
2
Caso em que você prefere type(thing).__name__ == 'str'mais type(thing) == strou isinstance(thing, str)? Também unicodenão existe nas versões modernas do Python.
vaultah