web-dev-qa-db-fra.com

Comment vérifier si variable est une chaîne avec python 2 et 3

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"

158
Randall Hunt

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)
187
ecatmur

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+.

107
hbristow

Qu'en est-il, cela fonctionne dans tous les cas?

isinstance(x, ("".__class__, u"".__class__))
30
Fil

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.

17
steveha

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

10
toto_tico

Peut-être utiliser une solution de contournement comme

def isstr(s):
    try:
        return isinstance(s, basestring)
    except NameError:
        return isinstance(s, str)
8
Lev Levitsky

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
6
Martin Hansen

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")
0
bunkus