Itérer sur une liste ou un élément unique en python
Je voudrais effectuer une itération sur les sorties d'une fonction inconnue. Malheureusement, je ne sais pas si la fonction renvoie un seul élément ou d'un tuple. Ce doit être un problème et il doit y avoir un moyen standard de traiter avec cela-ce que j'ai maintenant c'est assez moche.
x = UnknownFunction()
if islist(x):
iterator = x
else:
iterator = [x]
def islist(s):
try:
len(s)
return True
except TypeError:
return False
for ii in iterator:
#do stuff
source d'informationauteur Edward
Vous devez vous connecter pour publier un commentaire.
Le plus de solution générale à ce problème est l'utilisation
isinstance
avec la classe de base abstraitecollections.Iterable
.Vous pouvez également tester
basestring
ainsi, comme Kindall suggère.Maintenant, certaines personnes pourraient penser, comme je l'ai déjà fait", n'est-ce pas
isinstance
considéré comme nocif? N'est-ce pas vous enfermer dans l'aide d'un genre de type? N'utilisez pashasattr(x, '__iter__')
être mieux?"La réponse est: pas quand il s'agit de classes de base abstraites. En fait, vous pouvez définir votre propre classe avec un
__iter__
méthode et il sera reconnu comme une instance decollections.Iterable
même si vous n'avez pas de sous-classecollections.Iterable
. Cela fonctionne parce quecollections.Iterable
définit un__subclasshook__
qui détermine si un type est passé est un objet iterable par quelle que soit la définition qu'il implémente.Il n'est pas particulièrement élégant d'inclure le code partout où vous en avez besoin. Donc écrire une fonction qui fait le massage. Voici une suggestion je suis venu avec une semblable question précédente. Il spéciaux-cas des chaînes de caractères (ce qui est généralement itérable) en pièces uniques, qui est ce que je trouve d'habitude je veux.
Utilisation:
Vous aurez envie de faire ce qui suit:
puis
Peut-être mieux d'utiliser
collections.Iterable
pour savoir si la sortie est un objet iterable ou pas.Ceci fonctionnera si le type de x est l'un de ces -
list
tuple
dict
str
toute classe dérivée de ces.Vous pouvez également essayer d'utiliser l'opérateur.isSequenceType fonction
Vous pouvez définir une fonction qui assure la valeur retournée supporte l'itération (
str
dict
tuple
etc --y compris défini par l'utilisateur types de séquences qui ne sont pas directement hériter de ces classes) plutôt que de vérifier si c'est untuple
oulist
directement.