Estou ciente de que posso usar: isinstance(x, str)
no python-3.x, mas preciso verificar se algo também é uma string no python-2.x. Funcionará isinstance(x, str)
como esperado no python-2.x? Ou precisarei verificar a versão e usar isinstance(x, basestr)
?
Especificamente, em python-2.x:
>>>isinstance(u"test", str)
False
e python-3.x não possui u"foo"
python
string
python-3.x
python-2.x
Randall Hunt
fonte
fonte
Respostas:
Se você estiver escrevendo um código compatível com 2.x e 3.x, provavelmente precisará usar seis :
fonte
>>> isinstance(u"foo", string_types)
True
>>> isinstance(u"foo".encode("utf-8"), string_types)
True
Eu esperava que isinstance (u "foo", string_types) retornasse false.str
eunicode
no Python 2, oustr
no Python 3. Se você não quiserunicode
contar com o Python 2, basta usarstr
.future
pacote em vez desix
:from future.utils import string_types
A abordagem mais concisa que encontrei sem depender de pacotes como seis é:
então, supondo que você tenha verificado as strings no Python 2 da maneira mais genérica,
agora também funcionará para o Python 3+.
fonte
basestring = (str, bytes)
derequests/compat.py
if not hasattr(__builtins__, "basestring"): basestring = (str, bytes)
E sobre isso, funciona em todos os casos?
fonte
from __future__ import unicode_literals
atividade. Agora eu vou com:isinstance(val, (str, u"".__class__))
Esta é a resposta de @Lev Levitsky, reescrita um pouco.
O
try
/except
test é feito uma vez e, em seguida, define uma função que sempre funciona e é o mais rápido possível.EDIT: Na verdade, nem precisamos ligar
isinstance()
; só precisamos avaliarbasestring
e ver se temos umNameError
:Eu acho que é mais fácil seguir com a chamada para
isinstance()
, no entanto.fonte
isinstance("", basestring)
é o que eu quis dizer com "chamando". Enfim, +1.try: string_types = basestring except NameError: string_types = str
A
future
biblioteca adiciona (ao Python 2) nomes compatíveis , para que você possa continuar escrevendo o Python 3 . Você pode simplesmente fazer o seguinte:Para instalá-lo , basta executar
pip install future
.Como ressalva , ele só apoiar
python>=2.6
,>=3.3
mas é mais moderno do quesix
, o que só é recomendado se estiver usandopython 2.5
fonte
Talvez use uma solução alternativa como
fonte
isinstance(u'hello', basestr)
rendeSyntaxError: invalid syntax
com o Python 3.2.3 na Janela 7 .. alguma idéia do porquê? Não parece gostar dou
- recebo esse erro comstr
ebasestr
str
em Python3 é por definição Unicode. Consequentemente, não há nenhumbasestring
tipo, daí oNameError
que está capturado no meu trecho.try
/except
test uma única vez e, com base nos resultados desse único teste, você defineisstr()
corretamente. Não há necessidade de gerar uma exceção para todas as chamadasisstr()
.Você pode obter a classe de um objeto chamando
object.__class__
, portanto, para verificar se o objeto é o tipo de string padrão:E você pode colocar o seguinte na parte superior do seu código, para que as seqüências de caracteres entre aspas estejam em unicode no python 2:
fonte
some_element.text
é um 'str', mas a comparação com 'unicode' falhariaVocê pode tentar isso no início do seu código:
e mais tarde no código:
fonte
Seja cuidadoso! No python 2,
str
ebytes
são essencialmente os mesmos. Isso pode causar um erro se você estiver tentando distinguir entre os dois.fonte
tipo (string) == str
retorna true se for uma string e false se não
fonte
string
é uma string unicode