7
votes

Manière pythononique de vérifier le paramètre est une séquence mais pas une chaîne

J'ai une fonction qui reçoit une liste de tables DB en tant que paramètre et renvoie une chaîne de commande à exécuter sur ces tables, par exemple: xxx pré>

devrait renvoyer quelque chose comme: p >

pg_dump -t s -t t -t a -t c -t k -t o -t v -t e -t r -t f -t l -t o -t w
        -f /tmp/dump.sql -p 5434 europe


2 commentaires

Vous vous référez à un utilisateur utilisant ('foo') par erreur au lieu de ('foo',) , non?


@orip c'est le point: les utilisateurs peuvent faire cette erreur et je veux l'empêcher de se produire.


4 Réponses :


0
votes

Pouvez-vous ne pas utiliser une liste plutôt qu'un tuple?

pg_dump( file='/tmp/dump.sql',
         tables=['stack', 'overflow'],
         port=5434,
         name='europe')


1 commentaires

Ne résout pas le problème - si l'utilisateur passe une chaîne, il échoue toujours.



6
votes

Affirmation du type semble approprié dans ce cas - gérer une mauvaise utilisation commune qui semble légale à cause de la typage du canard.

Une autre façon de gérer ce cas commun serait de tester la chaîne et de la gérer correctement comme un cas particulier. < / p>

Enfin, vous pouvez encourager la transmission des noms de table comme paramètres de position qui rendraient ce scénario moins probable: xxx


1 commentaires

+1 Nice. Je pense que je vais tester le paramètre et convertir simplement une chaîne en 1 tuple. Il garderait les utilisateurs plus heureux.



1
votes

Un idiome de python commun pour détecter si un argument est une séquence (une liste ou un tuple) ou une chaîne est de vérifier si l'attribut __ iter __ : xxx P> Quand ce n'est pas une séquence, il est également courant de le changer en un pour simplifier le reste du code (qui n'a que pour traiter un type de chose). Dans l'échantillon, cela aurait pu être fait avec un simple arg = [arg] .


4 commentaires

Sidenote: Strings n'a pas d'attribut __ iTer __ une incohérence et a été modifié dans Python 3. Comme cela devrait être.


@Jim Brissom: J'ai toujours senti que c'était incompatible depuis que les chaînes sont après toutes les séquences de personnages. Connaître un bon idiome py3k? Que diriez-vous de vérifier si le type (arg) a une méthode de chaîne, comme "inférieur"?


Vous pouvez vérifier non iSinstance (foo, str) comme suggéré dans la question que l'Asker lié à ( bascule au lieu de str pour python <3 )


@orip: Bien sûr, on peut toujours taper vérifier, mais comme l'a indiqué l'OP, cela ne semble pas très "pythonique". Ce serait bien s'il y avait une façon générique de vérifier si quelque chose était une séquence ou non qui a été confondu par des types de chaîne - que ce que le test __ est en python 2 mais sonne comme ils "fixes" que dans v3.



2
votes

Vous pouvez utiliser ABCS pour affirmer qu'un objet est ibler mais non une chaîne: xxx


0 commentaires