Comment puis-je vérifier si un objet Python est une chaîne (régulière ou Unicode)?
python
string
types
compatibility
Matt S.
la source
la source
Réponses:
Python 2
À utiliser
isinstance(obj, basestring)
pour un objet à testerobj
.Docs .
la source
Python 2
Pour vérifier si un objet
o
est un type chaîne d'une sous-classe d'un type chaîne:parce que les deux
str
etunicode
sont des sous-classes debasestring
.Pour vérifier si le type de
o
est exactementstr
:Pour vérifier s'il
o
s'agit d'une instancestr
ou d'une sous-classe destr
:Les éléments ci-dessus fonctionnent également pour les chaînes Unicode si vous les remplacez
str
parunicode
.Cependant, vous n'aurez peut-être pas du tout besoin d'effectuer une vérification de type explicite. "Duck typing" peut répondre à vos besoins. Voir http://docs.python.org/glossary.html#term-duck-typing .
Voir aussi Quelle est la manière canonique de vérifier le type en python?
la source
basestring
dans py2.Python 3
En Python 3.x
basestring
n'est plus disponible, tout commestr
le seul type de chaîne (avec la sémantique de Python 2.xunicode
).Donc, la vérification dans Python 3.x est juste:
Cela suit le correctif de l'
2to3
outil de conversion officiel : conversionbasestring
enstr
.la source
Python 2 et 3
(compatibilité croisée)
Si vous souhaitez vérifier sans tenir compte de la version Python (2.x vs 3.x), utilisez
six
( PyPI ) et sonstring_types
attribut:Dans
six
(un module à fichier unique très léger), il fait simplement ceci :la source
future
( PyPI ) pour conserver même le nom:from past.builtins import basestring
basestring
, puis retombezstr
. Par exempledef is_string(obj): try: return isinstance(obj, basestring) # python 2 except NameError: return isinstance(obj, str) # python 3
J'ai trouvé cela et plus encore
pythonic
:puisque les objets type sont singleton, is peut être utilisé pour comparer l'objet au type str
la source
isinstance(obj_to_test, str)
est évidemment destiné à tester pour le type, et il a l'avantage d'utiliser la même procédure que pour les autres cas, non str.Si l'on veut éviter la vérification de type explicite (et il y a de bonnes raisons de s'en éloigner), la partie la plus sûre du protocole de chaîne à vérifier est probablement:
Il ne sera pas par un itérer itérables ou iterator, il ne sera pas appeler une liste de chaînes comme une chaîne et il détecte correctement un type corde comme une chaîne.
Bien sûr, il y a des inconvénients. Par exemple,
str(maybe_string)
peut être un calcul lourd. Comme souvent, la réponse est que cela dépend .EDIT: Comme @Tcll le souligne dans les commentaires, la question demande en fait un moyen de détecter à la fois les chaînes unicode et les bytestrings. Sur Python 2, cette réponse échouera avec une exception pour les chaînes unicode qui contiennent des caractères non ASCII, et sur Python 3, elle retournera
False
pour tous les bytestrings.la source
b = b'test'; r = str(b) == b
oùb
contient les mêmes données questr(b)
mais (étant un objet octets) ne valide pas en tant que chaîne.Afin de vérifier si votre variable est quelque chose, vous pouvez aller comme:
La sortie de isistance vous donnera une valeur booléenne True ou False afin que vous puissiez l'ajuster en conséquence. Vous pouvez vérifier l'acronyme attendu de votre valeur en utilisant initialement: type (s) Cela vous renverra "str" afin que vous puissiez l'utiliser dans la fonction isistance.
la source
Je pourrais traiter cela dans le style de frappe de canard, comme d'autres le mentionnent. Comment savoir qu'une chaîne est vraiment une chaîne? eh bien, évidemment en le convertissant en chaîne!
Si l'argument est déjà une chaîne ou un type unicode, real_word conservera sa valeur non modifiée. Si l'objet passé implémente une
__unicode__
méthode, celle-ci est utilisée pour obtenir sa représentation unicode. Si l'objet transmis ne peut pas être utilisé en tant que chaîne, la fonctionunicode
intégrée déclenche une exception.la source
sera True si votre objet est en effet de type chaîne. 'str' est un mot réservé.
mes excuses, la bonne réponse utilise «basestring» au lieu de «str» afin d'inclure également les chaînes unicode - comme cela a été noté ci-dessus par l'un des autres répondants.
la source
Ce soir, je suis tombé sur une situation dans laquelle je pensais que j'allais devoir vérifier le
str
type, mais il s'est avéré que non.Mon approche pour résoudre le problème fonctionnera probablement dans de nombreuses situations, donc je l'offre ci-dessous au cas où d'autres personnes lisant cette question seraient intéressées (Python 3 uniquement).
Quelques tests:
la source
C'est simple, utilisez le code suivant (nous supposons que l'objet mentionné est obj) -
la source
Vous pouvez le tester en concaténant avec une chaîne vide:
Modifier :
Correction de ma réponse après des commentaires soulignant que cela échoue avec les listes
la source
Pour une belle approche de type canard pour les chaînes de caractères qui a l'avantage de travailler avec Python 2.x et 3.x:
sagesse était proche du typage de canard avant de passer à l'
isinstance
approche, sauf que cela+=
a une signification différente pour les listes+
.la source
isalpha
, mais qui sait quelles méthodes seraient sûres de rechercher?__str__
méthode plus l'égalité peut en fait être à toute épreuve. Mais même cela n'est pas sans réserves.try
peut être plus rapide. Si vous vous y attendez 99% du temps, peut-être pas. La différence de performances étant minime, il vaut mieux être idiomatique à moins de profiler votre code et de l'identifier comme étant réellement lent.d'EDX - cours en ligne MITx: 6.00.1x Introduction à l'informatique et à la programmation à l'aide de Python
la source
str
!