@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 !!
Par exemple, pour un one liner:, value_is_string = isinstance(value, str if sys.version_info[0] >= 3 else basestring)où >=suppose que tout éventuel Python 4+ conserve la strclasse racine pour les chaînes.
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 =1if 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')
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
exceptNameError:# 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
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.
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 3if(sys.version_info[0]>=3):return isinstance(s, str)# we use Python 2return 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.
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).
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)
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.
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.
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.
isinstance(True, int) is True
.isinstance(x,str)
est correct en Python 3 (str est un type de base).Réponses:
En Python 2.x, vous feriez
basestring
est la superclasse abstraite destr
etunicode
. Il peut être utilisé pour tester si un objet est une instance destr
ouunicode
.Dans Python 3.x, le test correct est
La
bytes
classe n'est pas considérée comme un type de chaîne en Python 3.la source
unicode
objets, qui devraient également être considérés comme des chaînes. Le typestr
et le typeunicode
ont tous deux la classe de base communebasestring
, et c'est ce que vous voulez vérifier.basestring = str
.unicode
en 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émentisintance(s, six.string_types)
dans ce cas)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:
En inspectant le code, voici ce que vous trouvez:
la source
value_is_string = isinstance(value, str if sys.version_info[0] >= 3 else basestring)
où>=
suppose que tout éventuel Python 4+ conserve lastr
classe racine pour les chaînes.En Python 3.x ou Python 2.7.6
la source
==
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 destr
, qui devraient également être considérées comme des chaînes. Si vous voulez vraiment vérifier exactement le typestr
et exclure explicitement les sous-classes, utiliseztype(x) is str
.tu peux faire:
ou:
J'espère que cela t'aides!
la source
Le module de type existe également si vous vérifiez plus que des entiers et des chaînes. http://docs.python.org/library/types.html
la source
types.StringTypes
.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.
la source
isinstance()
prend également un tuple comme deuxième argument. Donc, même s'ilbasestring
n'existait pas, vous pouvez simplement l'utiliserisinstance(target, (str, unicode))
.unicode
ne semble pas être défini:NameError: name 'unicode' is not defined
comme
basestring
n'est pas défini en Python3, cette petite astuce pourrait aider à rendre le code compatible:après cela, vous pouvez exécuter le test suivant sur Python2 et Python3
la source
basestring = (str, bytes)
Python 2/3, y compris unicode
http://python-future.org/overview.html
la source
type('foo')
êtreunicode
par défaut en python 2, et la seconde faitstr
être une instance deunicode
. Cela rend le code valide en Python 2 et 3. Merci encore!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
la source
str
? Qu'en est-il des chaînes unicode, qui n'héritent même pas destr
2.x? Utiliserisinstance(s, basestring)
en 2.x ouisinstance(s, str)
en 3.x.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'utiliserstr
et les types sont des singletons, cetype(s) is str
sera donc un test plus efficace.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:
Dans cette fonction, nous utilisons
isinstance(object, classinfo)
pour voir si notre entrée eststr
en Python 3 oubasestring
en Python 2.la source
>=
au moins.Autre moyen pour Python 2, sans utiliser de chaîne de base:
Mais ne fonctionnera toujours pas en Python 3 car il
unicode
n'est pas défini (en Python 3).la source
Donc,
Vous disposez de nombreuses options pour vérifier si votre variable est une chaîne ou non:
Cette commande a un but.
la source
renvoie True
renvoie True
la source
Voici ma réponse pour prendre en charge Python 2 et Python 3 avec ces exigences:
six
un module compat ou similaire car ils ont tendance à cacher ce qui tente d'être réalisé.la source
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 ):
la source
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.
la source
la source
Voici comment je le fais:
la source
type(str())
est une façon très détournée de direstr
. Les types sont des singletons, c'est donctype(x) is str
plus efficace.isinstance()
doit être utilisé à la place, sauf si vous avez de très bonnes raisons d'ignorer les sous-classes destr
.J'ai vu:
la source
la source
type(thing).__name__ == 'str'
plustype(thing) == str
ouisinstance(thing, str)
? N'existeunicode
pas non plus dans les versions modernes de Python.