Je suis conscient que je peux utiliser: isinstance(x, str)
dans python-3.x, mais je dois également vérifier si quelque chose est une chaîne dans python-2.x. Est-ce que isinstance(x, str)
fonctionnera comme prévu dans python-2.x? Ou devrais-je vérifier la version et utiliser isinstance(x, basestr)
?
Plus précisément, dans python-2.x:
>>>isinstance(u"test", str)
False
et python-3.x n'a pas u"foo"
Si vous écrivez du code compatible avec les versions 2.x et 3.x, vous voudrez probablement utiliser six :
from six import string_types
isinstance(s, string_types)
L’approche la plus concise que j’ai trouvée sans me baser sur des paquets tels que six est la suivante:
try:
basestring
except NameError:
basestring = str
puis, en supposant que vous recherchiez des chaînes de la manière la plus générique Python 2),
isinstance(s, basestring)
fonctionnera également pour Python 3+.
Qu'en est-il, cela fonctionne dans tous les cas?
isinstance(x, ("".__class__, u"".__class__))
Ceci est la réponse de Lev Levski @ Lev, un peu réécrite.
try:
isinstance("", basestring)
def isstr(s):
return isinstance(s, basestring)
except NameError:
def isstr(s):
return isinstance(s, str)
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 devons juste évaluer basestring
et voir si nous obtenons un NameError
:
try:
basestring # attempt to evaluate basestring
def isstr(s):
return isinstance(s, basestring)
except NameError:
def isstr(s):
return isinstance(s, str)
Je pense qu'il est plus facile de suivre avec l'appel à isinstance()
, cependant.
La future
bibliothèque ajoute (à Python 2) des noms compatibles , afin que vous puissiez continuer à écrire Python 3 . Vous pouvez simplement effectuer les opérations suivantes:
from builtins import str
isinstance(x, str)
Pour l'installer , exécutez simplement pip install future
.
En tant que caveat, il ne supporte que python>=2.6
, >=3.3
, mais il est plus moderne que six
, qui est seulement recommandé si vous utilisez python 2.5
Peut-être utiliser une solution de contournement comme
def isstr(s):
try:
return isinstance(s, basestring)
except NameError:
return isinstance(s, str)
Vous pouvez obtenir la classe d'un objet en appelant object.__class__
, afin de vérifier si object est le type de chaîne par défaut:
isinstance(object,"".__class__)
Et vous pouvez placer les éléments suivants en haut de votre code afin que les chaînes entre guillemets soient en unicode dans python 2:
from __future__ import unicode_literals
Vous pouvez essayer ceci au début de votre code:
from __future__ import print_function
import sys
if sys.version[0] == "2":
py3 = False
else:
py3 = True
if py3:
basstring = str
else:
basstring = basestring
et plus tard dans le code:
anystring = "test"
# anystring = 1
if isinstance(anystring, basstring):
print("This is a string")
else:
print("No string")