Je suis conscient que je peux utiliser: isinstance(x, str)
en python-3.x mais je dois vérifier si quelque chose est une chaîne en python-2.x également. Fonctionnera-t-il isinstance(x, str)
comme prévu dans python-2.x? Ou aurai-je besoin de 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"
python
string
python-3.x
python-2.x
Randall Hunt
la source
la source
Réponses:
Si vous écrivez du code compatible 2.x et 3.x, vous voudrez probablement en utiliser six :
la source
>>> isinstance(u"foo", string_types)
True
>>> isinstance(u"foo".encode("utf-8"), string_types)
True
Je m'attendais à ce que isinstance (u "foo", string_types) retourne false.str
etunicode
sur Python 2, oustr
sur Python 3. Si vous ne voulezunicode
pas compter sur Python 2, utilisez simplementstr
.future
package au lieu desix
:from future.utils import string_types
L'approche la plus laconique que j'ai trouvée sans compter sur des packages comme six, est:
puis, en supposant que vous ayez vérifié les chaînes dans Python 2 de la manière la plus générique,
fonctionnera désormais également pour Python 3+.
la source
basestring = (str, bytes)
derequests/compat.py
if not hasattr(__builtins__, "basestring"): basestring = (str, bytes)
Qu'en est-il, fonctionne dans tous les cas?
la source
from __future__ import unicode_literals
actif. Maintenant, je vais avec:isinstance(val, (str, u"".__class__))
C'est la réponse de @Lev Levitsky, un peu réécrite.
Le test
try
/except
est effectué une fois, puis définit une fonction qui fonctionne toujours et qui 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()
, cependant.la source
isinstance("", basestring)
est ce que je voulais dire par «appeler». Quoi qu'il en soit, +1.try: string_types = basestring except NameError: string_types = str
La
future
bibliothèque ajoute (à Python 2) des noms compatibles , afin que vous puissiez continuer à écrire Python 3 . Vous pouvez simplement faire ce qui suit:Pour l'installer , exécutez simplement
pip install future
.En mise en garde , il ne supporte que
python>=2.6
,>=3.3
mais il est plus moderne quesix
, qui ne recommandé en cas d' utilisationpython 2.5
la source
Peut-être utiliser une solution de contournement comme
la source
isinstance(u'hello', basestr)
cèdeSyntaxError: invalid syntax
pour moi avec Python 3.2.3 sous Windows 7 .. une idée pourquoi cela serait? Il ne semble pas aimer leu
- j'obtiens cette erreur avecstr
etbasestr
str
dans Python3 est par définition Unicode. En conséquence, il n'y a pas debasestring
type, d'où leNameError
qui est pris dans mon extrait.try
/except
une seule fois, et en fonction des résultats de ce test unique, vous définissezisstr()
correctement. Il n'est pas nécessaire d'engager la surcharge d'une exception pour chaque appel àisstr()
.Vous pouvez obtenir la classe d'un objet en appelant
object.__class__
, donc pour vérifier si object est le type de chaîne par défaut:Et vous pouvez placer ce qui suit en haut de votre code afin que les chaînes entre guillemets soient en unicode en python 2:
la source
some_element.text
est un 'str' mais la comparaison avec 'unicode' échoueraitVous pouvez essayer ceci au début de votre code:
et plus tard dans le code:
la source
Faites attention! En python 2,
str
etbytes
sont essentiellement les mêmes. Cela peut provoquer un bug si vous essayez de faire la distinction entre les deux.la source
type (chaîne) == str
renvoie true si c'est une chaîne, et false sinon
la source
string
est une chaîne Unicode