Comment puis-je savoir si une variable python est une chaîne ou une liste?
J'ai une routine qui prend une liste de chaînes de caractères en paramètre, mais j'aimerais en charge la transmission d'une chaîne unique et de le convertir en une liste de chaînes. Par exemple:
def func( files ):
for f in files:
doSomethingWithFile( f )
func( ['file1','file2','file3'] )
func( 'file1' ) # should be treated like ['file1']
Comment puis-je savoir si une chaîne ou une liste a été adoptée dans? Je sais qu'il est un type
fonction, mais est-il un "plus pythonic" de la sorte?
InformationsquelleAutor Graeme Perrow | 2009-05-07
Vous devez vous connecter pour publier un commentaire.
Bien, il n'y a rien unpythonic sur la vérification de type. Ceci étant dit, si vous êtes prêt à mettre une petite charge sur l'appelant:
Je dirais c'est plus pythonic dans que "explicite est mieux que l'implicite". Ici, il y a au moins une reconnaissance de la part de l'appelant lorsque l'entrée est déjà sous forme de liste.
isinstance(your_var, str)
.Personnellement, je n'aime pas vraiment ce genre de comportement -- il interfère avec le duck-typing. On pourrait dire qu'il n'a pas obéir à la "Explicite est mieux qu'implicite" mantra. Pourquoi ne pas utiliser les varargs syntaxe:
func(file, someflag)
, ne peut pas être transformé enfunc(*files, someflag)
sans tournersomeflag
dans un mot-clé argJe dirais que la plupart Python y façon est de rendre l'utilisateur passe toujours une liste, même s'il n'existe qu'un seul élément. C'est vraiment évident
func()
peut prendre une liste de fichiersComme Dave l'a suggéré, vous pouvez utiliser le
func(*files)
de syntaxe, mais je n'ai jamais aimé cette fonctionnalité, et il semble plus explicite ("explicite est mieux qu'implicite") à simplement besoin d'une liste. C'est aussi transformer votre cas spécial (appelfunc
avec un seul fichier) dans le cas par défaut, parce que maintenant vous devez utiliser extra syntaxe pour appelerfunc
avec une liste..Si vous ne voulez pas faire un cas pour un argument une chaîne de caractères, utilisez le
isinstance()
builtin, et de les comparer àbasestring
(qui à la foisstr()
etunicode()
sont dérivées à partir de) par exemple:Vraiment, je suggère simplement exigeant une liste, même avec un seul fichier (après tout, il ne nécessite que deux caractères supplémentaires!)
basestring
. Utilisationstr
, sauf si vous faites allusion à l'un des octets de l'objet (que vous avez certainement ne devrait pas être pour ce cas d'utilisation).basestring
au lieu detypes
module.lower
méthode :-/casefold
méthode est sans doute plus à la chaîne commeSi vous avez plus de contrôle sur l'appelant, puis l'une des autres réponses, c'est mieux. Je n'ai pas le luxe dans mon cas, alors je me suis rabattue sur la solution suivante (avec des réserves):
Cette approche de travail pour les cas où vous faites affaire avec un savoir ensemble de la liste-tels que les types qui répondent aux critères ci-dessus. Certains types de séquence sera oubliée si.
Varargs a été déroutant pour moi, donc je l'ai testé en Python à clarifier les choses pour moi-même.
Tout d'abord la crête pour les varargs est ici.
Voici un exemple de programme, sur la base des deux réponses de Dave et David Berger, suivi par la sortie, juste pour avoir des précisions.
Et le résultat;
Espérant que cela sera utile à quelqu'un d'autre.