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 de caractères (réguliers ou Unicode)?
- Ce que Jason se référant à l'est du duck-typing (si il charlatans comme un canard, c'est probablement un canard). En Python, vous avez souvent "laissez vos code du travail" sur n'importe quelle chaîne, comme objet, sans vérifier si c'est une chaîne ou une chaîne de sous-classe. Pour plus d'info, voir: docs.python.org/glossary.html#term-duck-typing
- C'est ce que j'aime à propos de la SORTE. J'ai l'habitude de poser une question, il ne répond pas, les gens me disent que je ne devrais pas faire ça de toute façon et pourquoi, et je grandir en tant que programmeur. =)
- +1: tout Simplement parce que la réponse est rarement nécessaire, ne signifie pas que la question n'est pas valide. Même si je pense que c'est génial d'avoir une attention ici, je ne pense pas qu'il mérite de la rétrogradation de la question.
- C'est peut-être le plus de l'usage légitime de la vérification du type en Python. Les chaînes sont itératif, afin de les distinguer des listes de toute autre manière est une mauvaise idée.
- Il y a certainement des cas où il est nécessaire de distinguer les chaînes à partir d'autres iterables. Par exemple, voir le code source pour PrettyPrinter dans le pprint module.
- “Si ça ressemble à un canard et les charlatans comme un canard, il doit etre un canard.”
- Je pense que le duck-typing est destinée à travailler avec le polymorphisme. Certaines personnes ont une réaction réflexe à l'encontre de TOUTES python vérification de type. Ben du lien n'a pas vraiment parler contre des choses où les types ont fondamentalement différents comportements. Mon interprétation est que le duck-typing est destinée à faire confiance à la Principe de Substitution de Liskov
- Les chaînes ne sont pas seulement iterables, ils sont iterables de chaînes de caractères. Les distinguant des autres iterables de chaîne sans "triche" est presque impossible. Mais ensuite, il y a stringlike et la triche code des pauses.
- Depuis beaucoup de nouvelles personnes vont probablement lu cela: d'abord, assurez-vous que vous n'avez vraiment vérifier. Ma réponse pourrait donner quelques idées sur la façon d'éviter la case.
- Voir aussi stackoverflow.com/questions/4843173/...
Vous devez vous connecter pour publier un commentaire.
Python 2
Utilisation
isinstance(obj, basestring)
pour un objet à testerobj
.Docs.
Pour vérifier si un objet
o
est un type de chaîne d'une sous-classe d'un type de 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 si
o
est une instance destr
ou d'une sous-classe destr
:Ci-dessus fonctionnent aussi pour des chaînes Unicode si vous remplacez
str
avecunicode
.Cependant, vous ne pouvez pas besoin de faire de type explicite tout de vérification. "Duck typing" peut s'adapter à vos besoins. Voir http://docs.python.org/glossary.html#term-duck-typing.
Voir aussi Quelle est la manière canonique pour vérifier le type en python?
basestring
dans py2.Python 3
En Python 3.x
basestring
n'est plus disponible, commestr
est le seul type de chaîne (avec la sémantique de Python 2.xunicode
).Afin de le vérifier en Python 3.x est juste:
Ce qui suit le correctif de l'officiel
2to3
outil de conversion: la conversion debasestring
àstr
.repr()
de votre chaîne de retour?Python 2 et 3
(croix-compatible)
Si vous voulez vérifier avec aucun égard pour la version de Python (2.x vs 3.x), utilisez
six
(PyPI) et de sesstring_types
attribut:Dans
six
(un très léger-poids à fichier unique module), c'est tout simplement de faire cette:future
(PyPI) à même de conserver le nom:from past.builtins import basestring
basestring
et ensuite retomber àstr
. E. g.def is_string(obj): try: return isinstance(obj, basestring) # python 2 except NameError: return isinstance(obj, str) # python 3
J'ai trouvé cette sna plus
pythonic
:depuis les objets de type sont singleton, est peut être utilisé pour faire la comparaison de l'objet pour le str type
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 d'autres, la non-str cas.Si l'on veut rester à l'écart de type explicite-de la vérification (et il y en sont de bonnes raisons de rester loin de lui), probablement la partie la plus sûre de la chaîne protocole à vérifier est:
De ne pas faire une itération sur un objet iterable ou itérateur, il ne fera pas appel à une liste de chaînes de caractères une chaîne de caractères et il détecte correctement une stringlike comme une chaîne de caractères.
Bien sûr, il ya des inconvénients. Par exemple,
str(maybe_string)
peut être lourd de calcul. Comme souvent, la réponse est ça dépend.Afin de vérifier si votre variable est quelque chose que vous pourrait aller comme:
La sortie de isistance vous donnera une valeur booléenne True ou False valeur, de sorte que vous pouvez ajuster en conséquence.
Vous pouvez vérifier les attendus de l'acronyme de votre valeur en utilisant en premier lieu:
type(s)
Cela vous permettra de revenir de type 'str' de sorte que vous pouvez l'utiliser dans le isistance fonction.
Je pourrais gérer cela à la duck-typing style, comme d'autres parlent. Comment puis-je savoir une chaîne de caractères est vraiment une chaîne de caractères? bon, évidemment, par conversion une chaîne!
Si l'argument est déjà une chaîne de caractères unicode ou type, real_word tiendra sa valeur non modifiée. Si l'objet passé implémente un
__unicode__
méthode, 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, launicode
builtin soulève une exception.sera Vrai si votre objet est en effet une chaîne de type. 'str' est mot réservé.
mes excuses,
la bonne réponse est à l'aide de 'basestring' au lieu de 'str' afin de il pour inclure des chaînes unicode ainsi - comme cela a été indiqué ci-dessus par l'un des autres intervenants.
Vous pouvez le tester par la concaténation d'une chaîne vide:
Modifier:
Corriger ma réponse après les commentaires soulignant que cela échoue avec des listes
Ce soir, j'ai couru dans une situation dans laquelle je pensée j'allais avoir à vérifier à l'
str
type, mais il s'est avéré que je n'ai pas.Mon approche pour résoudre le problème va probablement travailler dans de nombreuses situations, donc je vous le propose ci-dessous dans le cas des autres la lecture de cette question sont intéressés (Python 3 uniquement).
Quelques tests:
Pour un gentil canard-typage approche de chaîne-aime qui a le bonus de travailler avec Python 2.x et 3.x:
wisefish était proche avec le duck-typing avant il est passé à la
isinstance
approche, sauf que+=
a une signification différente pour les listes de+
n'.isalpha
, mais qui sait quelles méthodes seraient en sécurité à chercher?__str__
méthode plus d'égalité peut réellement être infaillible de l'un. Mais même cela n'est pas sans mises en garde.try
peut être plus rapide. Si vous vous attendez à 99% du temps, peut-être pas. La différence de performances est minime, il est préférable d'être idiomatiques, à moins que vous le profil de votre code et de l'identifier comme étant effectivement lent.de
EDX - cours en ligne
MITx: 6.00.1 x Introduction à l'Informatique et à la Programmation avec Python
str
!