Comment vérifier si le type d'une variable est une chaîne?

766

Existe-t-il un moyen de vérifier si le type d'une variable en python est un string, comme:

isinstance(x,int);

pour les valeurs entières?

c_pleaseUpvote
la source
11
Lecture obligatoire sur isinstance si vous apprenez python canonical.org/~kragen/isinstance .
whaley
Soyez prudent avec les pouces depuis isinstance(True, int) is True.
Albert Tugushev
isinstance(x,str)est correct en Python 3 (str est un type de base).
MasterControlProgram

Réponses:

1139

En Python 2.x, vous feriez

isinstance(s, basestring)

basestringest la superclasse abstraite de stret unicode. Il peut être utilisé pour tester si un objet est une instance de strou unicode.


Dans Python 3.x, le test correct est

isinstance(s, str)

La bytesclasse n'est pas considérée comme un type de chaîne en Python 3.

Sven Marnach
la source
10
@Yarin: Non. Mais cela n'a pas d'importance, car Python 3.x n'est pas censé être compatible avec Python 2.x du tout.
netcoder
2
J'ai trouvé que isinstance (s, str) fonctionne avec py27, testé sur: Python 2.7.5 (par défaut, 25 août 2013, 00:04:04) [GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] sur darwin.
kakyo
25
@kakyo: Le problème est qu'il manquera des unicodeobjets, qui devraient également être considérés comme des chaînes. Le type stret le type unicodeont tous deux la classe de base commune basestring, et c'est ce que vous voulez vérifier.
Sven Marnach
7
@Yarin si vous portez quelque chose de 2.x à 3.x, vous pouvez toujours l'attribuer basestring = str.
Jack
9
@AdamErickson Pour la compatibilité avec quoi exactement? Cela n'aide pas pour la compatibilité avec Python 3, car il n'y unicodeen a pas dans Python 3. Ma recommandation pour la compatibilité entre Python 2 et 3 est d'utiliser la bibliothèque "six". (Plus précisément isintance(s, six.string_types)dans ce cas)
Sven Marnach
222

Je sais que c'est un vieux sujet, mais étant le premier affiché sur google et étant donné que je ne trouve aucune réponse satisfaisante, je vais laisser ceci ici pour référence future:

six est une bibliothèque de compatibilité Python 2 et 3 qui couvre déjà ce problème. Vous pouvez alors faire quelque chose comme ceci:

import six

if isinstance(value, six.string_types):
    pass # It's a string !!

En inspectant le code, voici ce que vous trouvez:

import sys

PY3 = sys.version_info[0] == 3

if PY3:
    string_types = str,
else:
    string_types = basestring,
André Fratelli
la source
4
Par exemple, pour un one liner:, value_is_string = isinstance(value, str if sys.version_info[0] >= 3 else basestring)>=suppose que tout éventuel Python 4+ conserve la strclasse racine pour les chaînes.
Pi Marillion
65

En Python 3.x ou Python 2.7.6

if type(x) == str:
Texom512
la source
10
J'aime l'élégance de "if type (x) in (str, unicode):", mais je vois PyLint le signaler comme "unidiomatique".
eukras
16
La comparaison des types avec ==est explicitement déconseillée par PEP8 et présente plusieurs inconvénients en plus d'être considérée comme "non-idiomatique", par exemple, elle ne détecte pas les instances de sous-classes de str, qui devraient également être considérées comme des chaînes. Si vous voulez vraiment vérifier exactement le type stret exclure explicitement les sous-classes, utilisez type(x) is str.
Sven Marnach du
17

tu peux faire:

var = 1
if type(var) == int:
   print('your variable is an integer')

ou:

var2 = 'this is variable #2'
if type(var2) == str:
    print('your variable is a string')
else:
    print('your variable IS NOT a string')

J'espère que cela t'aides!

F. Taylor
la source
11

Modifier en fonction d'une meilleure réponse ci-dessous. Descendez environ 3 réponses et découvrez la fraîcheur du basestring.

Ancienne réponse: faites attention aux chaînes unicode, que vous pouvez obtenir à plusieurs endroits, y compris tous les appels COM dans Windows.

if isinstance(target, str) or isinstance(target, unicode):
Wade Hatler
la source
1
Bonne prise. Je ne connaissais pas le basestring. Il est mentionné environ 3 messages et semble être une meilleure réponse.
Wade Hatler
6
isinstance()prend également un tuple comme deuxième argument. Donc, même s'il basestringn'existait pas, vous pouvez simplement l'utiliser isinstance(target, (str, unicode)).
Martijn Pieters
3
En python 3.5.1, unicodene semble pas être défini:NameError: name 'unicode' is not defined
Eric Hu
11

comme basestringn'est pas défini en Python3, cette petite astuce pourrait aider à rendre le code compatible:

try: # check whether python knows about 'basestring'
   basestring
except NameError: # no, it doesn't (it's Python3); use 'str' instead
   basestring=str

après cela, vous pouvez exécuter le test suivant sur Python2 et Python3

isinstance(myvar, basestring)
umläute
la source
4
Ou si vous voulez aussi attraper des chaînes d'octets:basestring = (str, bytes)
Mark Ransom
10

Python 2/3, y compris unicode

from __future__ import unicode_literals
from builtins import str  #  pip install future
isinstance('asdf', str)   #  True
isinstance(u'asdf', str)  #  True

http://python-future.org/overview.html

crizCraig
la source
1
Merci beaucoup! Il existe des dizaines de réponses diverses sur Internet, mais le seul avantage est celui-ci. La première ligne fait type('foo')être unicodepar défaut en python 2, et la seconde fait strêtre une instance de unicode. Cela rend le code valide en Python 2 et 3. Merci encore!
Narann
9

Je veux également remarquer que si vous voulez vérifier si le type d'une variable est un type spécifique, vous pouvez comparer le type de la variable au type d'un objet connu.

Pour la chaîne, vous pouvez utiliser ceci

type(s) == type('')
Daniil Grankin
la source
7
C'est une façon terrible, terrible de taper check in python. Et si une autre classe hérite str? Qu'en est-il des chaînes unicode, qui n'héritent même pas de str2.x? Utiliser isinstance(s, basestring)en 2.x ou isinstance(s, str)en 3.x.
Jack
1
@Jack, veuillez lire la question, et remarquez également que je n'écris pas que c'est la meilleure façon, juste une autre façon.
Daniil Grankin
9
C'est une mauvaise idée pour 3 raisons: isinstance()permet les sous-classes (qui sont aussi des chaînes, juste spécialisées), l' type('')appel supplémentaire est redondant lorsque vous pouvez simplement l'utiliser stret les types sont des singletons, ce type(s) is strsera donc un test plus efficace.
Martijn Pieters
8

Beaucoup de bonnes suggestions fournies par d'autres ici, mais je ne vois pas un bon résumé multiplateforme. Ce qui suit devrait être une bonne solution pour tout programme Python:

def isstring(s):
    # if we use Python 3
    if (sys.version_info[0] >= 3):
        return isinstance(s, str)
    # we use Python 2
    return isinstance(s, basestring)

Dans cette fonction, nous utilisons isinstance(object, classinfo)pour voir si notre entrée est stren Python 3 ou basestringen Python 2.

duanev
la source
1
Cela cassera probablement dans Python 4, pensez >=au moins.
thakis
2
soyez plus propre pour vérifier six.string_types ou six.text_type
daonb
@daonb importer un module entier juste pour faire un test en ligne est la pensée qui fait que les arbres de dépendance fous et les ballonnements sérieux ruinent ce qui devrait être quelque chose de court petit et simple. C'est votre appel bien sûr, mais dites simplement ...
duanev
@duanev si vous vous inquiétez de la compatibilité avec Python 2/3, il est préférable d'utiliser de toute façon six dans le projet. Six est également un fichier unique, donc les arbres de dépendance / ballonnement ne sont pas un problème ici.
MoxieBall
7

Autre moyen pour Python 2, sans utiliser de chaîne de base:

isinstance(s, (str, unicode))

Mais ne fonctionnera toujours pas en Python 3 car il unicoden'est pas défini (en Python 3).

yprez
la source
7

Donc,

Vous disposez de nombreuses options pour vérifier si votre variable est une chaîne ou non:

a = "my string"
type(a) == str # first 
a.__class__ == str # second
isinstance(a, str) # third
str(a) == a # forth
type(a) == type('') # fifth

Cette commande a un but.

PatNowak
la source
5
a = '1000' # also tested for 'abc100', 'a100bc', '100abc'

isinstance(a, str) or isinstance(a, unicode)

renvoie True

type(a) in [str, unicode]

renvoie True

be_good_do_good
la source
Pour Python 2.7.12, j'ai dû supprimer les guillemets: tapez (a) dans [str, unicode]
Adam Erickson
4

Voici ma réponse pour prendre en charge Python 2 et Python 3 avec ces exigences:

  • Écrit en code Py3 avec un code de compatibilité Py2 minimal.
  • Supprimez le code de compatibilité Py2 plus tard sans interruption. C'est-à-dire ne viser que la suppression, pas de modification du code Py3.
  • Évitez d'utiliser sixun module compat ou similaire car ils ont tendance à cacher ce qui tente d'être réalisé.
  • A l'épreuve du temps pour un potentiel Py4.

import sys
PY2 = sys.version_info.major == 2

# Check if string (lenient for byte-strings on Py2):
isinstance('abc', basestring if PY2 else str)

# Check if strictly a string (unicode-string):
isinstance('abc', unicode if PY2 else str)

# Check if either string (unicode-string) or byte-string:
isinstance('abc', basestring if PY2 else (str, bytes))

# Check for byte-string (Py3 and Py2.7):
isinstance('abc', bytes)
Cas
la source
1

Si vous ne voulez pas dépendre de bibliothèques externes, cela fonctionne à la fois pour Python 2.7+ et Python 3 ( http://ideone.com/uB4Kdc ):

# your code goes here
s = ["test"];
#s = "test";
isString = False;

if(isinstance(s, str)):
    isString = True;
try:
    if(isinstance(s, basestring)):
        isString = True;
except NameError:
    pass;

if(isString):
    print("String");
else:
    print("Not String");
mPrinC
la source
1

Vous pouvez simplement utiliser la fonction isinstance pour vous assurer que les données d'entrée sont au format chaîne ou unicode . Les exemples ci-dessous vous aideront à comprendre facilement.

>>> isinstance('my string', str)
True
>>> isinstance(12, str)
False
>>> isinstance('my string', unicode)
False
>>> isinstance(u'my string',  unicode)
True
Hassan Mehmood
la source
-3
s = '123'
issubclass(s.__class__, str)
vadim vaduxa
la source
-6

Voici comment je le fais:

if type(x) == type(str()):
Utilisateur
la source
4
type(str()) est une façon très détournée de dire str . Les types sont des singletons, c'est donc type(x) is strplus efficace. isinstance()doit être utilisé à la place, sauf si vous avez de très bonnes raisons d'ignorer les sous-classes de str.
Martijn Pieters
si le type (x) est str:
shaurya uppal
-7

J'ai vu:

hasattr(s, 'endswith') 
dent rapide
la source
-13
>>> thing = 'foo'
>>> type(thing).__name__ == 'str' or type(thing).__name__ == 'unicode'
True
Richard Urban
la source
2
Dans ce cas , préférez - vous type(thing).__name__ == 'str'plus type(thing) == strou isinstance(thing, str)? N'existe unicodepas non plus dans les versions modernes de Python.
vaultah