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?


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.


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,

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:

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!



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):

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)

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


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('')

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.


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


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.


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


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)

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");

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


-6

Voici comment je le fais:

if type(x) == type(str()):

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


-13
>>> thing = 'foo'
>>> type(thing).__name__ == 'str' or type(thing).__name__ == 'unicode'
True

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.