@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 !!
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.
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 =1if 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')
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
exceptNameError:# no, it doesn't (it's Python3); use 'str' instead
basestring=str
Depois disso, você pode executar o seguinte teste no Python2 e Python3
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.
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 3if(sys.version_info[0]>=3):return isinstance(s, str)# we use Python 2return isinstance(s, basestring)
Nesta função, usamos isinstance(object, classinfo)para ver se nossa entrada é a strem Python 3 ou a basestringem Python 2.
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).
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)
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.
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.
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.
isinstance(True, int) is True
.isinstance(x,str)
está correto no Python 3 (str é um tipo básico).Respostas:
No Python 2.x, você faria
basestring
é a superclasse abstrata destr
eunicode
. Pode ser usado para testar se um objeto é uma instância destr
ouunicode
.No Python 3.x, o teste correto é
A
bytes
classe não é considerada um tipo de string no Python 3.fonte
unicode
objetos, que também devem ser considerados strings. Tanto o tipostr
quanto o tipounicode
têm a classe base comumbasestring
, e é isso que você deseja verificar.basestring = str
.unicode
no Python 3. Minha recomendação de compatibilidade entre o Python 2 e 3 é usar a biblioteca "six". (Especificamenteisintance(s, six.string_types)
neste caso)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:
Inspecionando o código, é isso que você encontra:
fonte
value_is_string = isinstance(value, str if sys.version_info[0] >= 3 else basestring)
onde>=
assume que qualquer Python 4+ eventual mantém astr
classe raiz para strings.No Python 3.x ou Python 2.7.6
fonte
==
é explicitamente desencorajada pelo PEP8 e possui várias desvantagens além de ser considerada "unidiomatic", por exemplo, não detecta instâncias de subclasses destr
, que também devem ser consideradas seqüências de caracteres. Se você realmente deseja verificar exatamente o tipostr
e excluir subclasses explicitamente, usetype(x) is str
.você pode fazer:
ou:
espero que isto ajude!
fonte
O módulo de tipo também existe se você estiver verificando mais do que ints e strings. http://docs.python.org/library/types.html
fonte
types.StringTypes
,.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.
fonte
isinstance()
também usa uma tupla como segundo argumento. Então, mesmobasestring
que não existisse, você poderia apenas usarisinstance(target, (str, unicode))
.unicode
não parece estar definido:NameError: name 'unicode' is not defined
Como
basestring
não está definido no Python3, esse pequeno truque pode ajudar a tornar o código compatível:Depois disso, você pode executar o seguinte teste no Python2 e Python3
fonte
basestring = (str, bytes)
Python 2/3, incluindo unicode
http://python-future.org/overview.html
fonte
type('foo')
serunicode
por padrão no python 2, e a segunda fazstr
ser instância deunicode
. Thoses torna o código válido no Python 2 e 3. Obrigado novamente!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
fonte
str
? E as strings unicode, que nem herdam dastr
2.x? Useisinstance(s, basestring)
no 2.x ouisinstance(s, str)
no 3.x.isinstance()
permite subclasses (que também são strings, apenas especializadas), atype('')
chamada extra é redundante quando você pode simplesmente usarstr
e os tipos são singletons, por issotype(s) is str
será um teste mais eficiente.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:
Nesta função, usamos
isinstance(object, classinfo)
para ver se nossa entrada é astr
em Python 3 ou abasestring
em Python 2.fonte
>=
pelo menos.Maneira alternativa para Python 2, sem usar a cadeia de base:
Mas ainda não funcionará no Python 3, pois
unicode
não está definido (no Python 3).fonte
Assim,
Você tem várias opções para verificar se sua variável é string ou não:
Esta ordem é para fins.
fonte
retorna True
retorna True
fonte
Aqui está minha resposta para oferecer suporte ao Python 2 e Python 3, juntamente com estes requisitos:
six
ou um módulo compatível semelhante, pois eles tendem a esconder o que está tentando ser alcançado.fonte
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 ):
fonte
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.
fonte
fonte
É assim que eu faço:
fonte
type(str())
é uma maneira muito indireta de dizerstr
. 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 destr
.Eu tenho visto:
fonte
fonte
type(thing).__name__ == 'str'
maistype(thing) == str
ouisinstance(thing, str)
? Tambémunicode
não existe nas versões modernas do Python.