Comment vérifier si la variable est une chaîne avec python 2 et 3 de compatibilité
Je suis conscient que je peux utiliser: isinstance(x, str)
en python-3.x mais j'ai besoin de vérifier si quelque chose est une chaîne de caractères en python-2.x ainsi. Va isinstance(x, str)
fonctionner comme prévu en python-2.x? Ou ai-je besoin pour vérifier la version et l'utilisation isinstance(x, basestr)
?
Plus précisément, en python-2.x:
>>>isinstance(u"test", str)
False
et python-3.x n'a pas u"foo"
- u"" syntaxe de l'Unicode des littéraux est réintroduit dans Python 3.3
- Exactement, c'est un problème délicat à résoudre... merci.
- Impair. J'ai ` ">>> isinstance(u"test", basestring) True `` Python 2.7.16
Vous devez vous connecter pour publier un commentaire.
Si vous êtes à la rédaction de 2.x-et-3.x-code compatible, vous voudrez probablement utiliser six:
>>> isinstance(u"foo", string_types)
True
>>> isinstance(u"foo".encode("utf-8"), string_types)
True
Je m'attendais à isinstance(u"foo", string_types) retourne la valeur false.str
etunicode
sur Python 2, oustr
sur Python 3. Si vous ne voulez pasunicode
compter sur Python 2, il suffit d'utiliserstr
.future
paquet au lieu desix
:from future.utils import string_types
Les plus laconique approche que j'ai trouvé sans compter sur les paquets de six, est:
ensuite, en supposant que vous avez été vérifier pour les chaînes de caractères en Python 2 dans la plupart de manière générique,
allons maintenant travailler pour Python 3+.
basestring = (str, bytes)
derequests/compat.py
if not hasattr(__builtins__, "basestring"): basestring = (str, bytes)
Ce, fonctionne dans tous les cas?
from __future__ import unicode_literals
active. Maintenant, je vais avec:isinstance(val, (str, u"".__class__))
C'est @Lev Levitsky réponse de la ré-écrit un peu.
La
try
/except
test est fait une fois, puis définit une fonction qui fonctionne toujours et est aussi rapide que possible.EDIT: en Fait, nous n'avons même pas besoin d'appeler
isinstance()
; nous avons juste besoin d'évaluerbasestring
et de voir si nous obtenons unNameError
:Je pense que c'est plus facile à suivre avec l'appel à
isinstance()
, si.isinstance("", basestring)
est ce que je voulais dire par "vocation". De toute façon, +1.try: string_types = basestring except NameError: string_types = str
La
avenir
de la bibliothèque ajoute (pour Python 2) compatible noms, de sorte que vous pouvez continuer à écrire en Python 3. Vous pouvez très simplement faire ce qui suit:Pour l'installer, exécutez simplement
pip install future
.Comme un mise en garde, il ne l'appui
python>=2.6
,>=3.3
, mais il est plus moderne quesix
, qui est à seulement recommandé si vous utilisezpython 2.5
from
au lieu defor
?Peut-être utiliser une solution de contournement comme
isinstance(u'hello', basestr)
rendementsSyntaxError: invalid syntax
pour moi avec Python 3.2.3 sous Window 7 .. aucune idée pourquoi ce serait? Il ne semble pas aimer leu
- j'ai cette erreur avecstr
etbasestr
str
en Python3 est, par définition, Unicode. En conséquence, il n'y a pasbasestring
type, d'où leNameError
qui est pêché dans mon code.try
/except
test qu'une seule fois, et sur la base des résultats de ce test, vous définissezisstr()
correctement. Il n'est pas nécessaire pour assumer les frais généraux d'une exception pour chaque appel deisstr()
.Vous pouvez obtenir la classe d'un objet en appelant
object.__class__
, afin de vérifier si l'objet est le type de chaîne par défaut:Et Vous pouvez placer celui-ci dans le haut de Votre code, de sorte que les chaînes de caractères délimitée par des guillemets sont en unicode python 2:
some_element.text
est un 'str', mais la comparaison avec "unicode" serait un échecVous pouvez essayer ceci au début de votre code:
et plus tard dans le code:
type(string) == str
renvoie vrai si son une chaîne de caractères, ou false si pas
string
est une chaîne unicode