457 votes

Comment savoir si un objet Python est une chaîne de caractères ?

Comment puis-je vérifier si un objet Python est une chaîne (régulière ou Unicode) ?

18 votes

Ce à quoi Jason fait référence, c'est le typage de canard (si ça fait coin-coin comme un canard, c'est probablement un canard). En Python, vous pouvez souvent "laisser votre code fonctionner" sur n'importe quel objet ressemblant à une chaîne de caractères sans vérifier s'il s'agit d'une chaîne ou d'une sous-classe de chaîne. Pour plus d'informations, voir : docs.python.org/glossary.html#term-duck-typing (en anglais)

5 votes

C'est ce que j'aime dans le SO. En général, je pose une question, on ne me répond pas, les gens me disent que je ne devrais pas faire ça de toute façon et pourquoi, et je grandis en tant que programmeur. =)

25 votes

+1 : Ce n'est pas parce qu'une réponse est rarement nécessaire que la question est invalide. Bien que je pense que c'est une bonne chose d'avoir une mise en garde ici, je ne pense pas que cela mérite de rétrograder la question.

310voto

John Fouhy Points 14700

Python 2

Utilice isinstance(obj, basestring) pour un objet à tester obj .

Docs .

0 votes

Toutes les solutions présentées sur cette page ne sont pas à l'abri d'une erreur. Je veux dire basestring y str peuvent tous deux être écrasés, ce qui rendra toutes ces solutions invalides.

191voto

Matt S. Points 869

Python 2

Pour vérifier si un objet o est un type de chaîne de caractères d'une sous-classe d'un type de chaîne de caractères :

isinstance(o, basestring)

parce que les deux str y unicode sont des sous-classes de basestring .

Pour vérifier si le type de o est exactement str :

type(o) is str

Pour vérifier si o est une instance de str ou toute sous-classe de str :

isinstance(o, str)

Ce qui précède fonctionne également pour les chaînes Unicode si vous remplacez str con unicode .

Cependant, il se peut que vous n'ayez pas du tout besoin d'effectuer une vérification explicite des types. Le "Duck typing" peut répondre à vos besoins. Voir http://docs.python.org/glossary.html#term-duck-typing .

Voir aussi Quelle est la façon canonique de vérifier le type en python ?

0 votes

La variable locale 'str' est référencée avant l'affectation

0 votes

@johnktejik python3 vs python2. Vous devez vérifier pour basestring dans py2.

96voto

Nick T Points 5466

Python 2 et 3

(compatibilité croisée)

Si vous voulez vérifier sans tenir compte de la version de Python (2.x vs 3.x), utilisez six ( PyPI ) et son string_types attribut :

import six

if isinstance(obj, six.string_types):
    print('obj is a string!')

Sur six (un module monofichier très léger), il fait simplement este :

import sys
PY3 = sys.version_info[0] == 3

if PY3:
    string_types = str
else:
    string_types = basestring

0 votes

Alternativement, vous pouvez utiliser future ( PyPI ) pour conserver ce nom : from past.builtins import basestring

1 votes

BTW le Aide-mémoire est une excellente ressource pour la compatibilité des versions de Python.

1 votes

Et si vous n'utilisiez pas d'importations ? Premier essai basestring et ensuite revenir à str . Par exemple def is_string(obj): try: return isinstance(obj, basestring) # python 2 except NameError: return isinstance(obj, str) # python 3

5voto

IfLoop Points 59461

Je pourrais traiter cette question dans le style de la dactylographie en canard, comme d'autres l'ont mentionné. Comment puis-je savoir qu'une chaîne de caractères est vraiment une chaîne de caractères ? bien, évidemment par conversion de en une chaîne de caractères !

def myfunc(word):
    word = unicode(word)
    ...

Si l'argument est déjà une chaîne ou un type unicode, real_word conservera sa valeur sans être modifié. Si l'objet passé implémente un __unicode__ qui est utilisée pour obtenir sa représentation unicode. Si l'objet passé ne peut pas être utilisé comme une chaîne de caractères, la méthode unicode soulève une exception.

3voto

beepbeep Points 11
isinstance(your_object, basestring)

sera True si votre objet est effectivement un string-type. str' est un mot réservé.

Toutes mes excuses, la réponse correcte est d'utiliser '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 intervenants.

0 votes

Ne fonctionne pas pour les objets unicode, qui ont été explicitement demandés dans la question.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X