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: 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
4 Réponses :
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')
Ne résout pas le problème - si l'utilisateur passe une chaîne, il échoue toujours.
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: p>
+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.
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 __ code>:
arg = [arg] code>. P> p>
Sidenote: Strings n'a pas d'attribut __ iTer __ code> 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) code> a une méthode de chaîne, comme "inférieur"?
Vous pouvez vérifier non iSinstance (foo, str) code> comme suggéré dans la question que l'Asker lié à (
bascule code> au lieu de
str code> 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 __ code> est en python 2 mais sonne comme ils "fixes" que dans v3.
Vous pouvez utiliser ABCS pour affirmer qu'un objet est ibler mais non une chaîne:
Vous vous référez à un utilisateur utilisant
('foo') code> par erreur au lieu de
('foo',) code>, non?
@orip c'est le point: les utilisateurs peuvent faire cette erreur et je veux l'empêcher de se produire.