6
votes

Convertir une liste en défini, mais si vide utilisez une valeur par défaut

Je cherche un moyen plus agréable d'attribuer un ensemble avec la convention d'une liste si cette liste n'est pas vide, sinon une autre liste doit être utilisée.

Si cela est possible, je voudrais un moyen plus agréable de Ecrivez ceci (ou un argument sur la raison pour laquelle c'est la meilleure façon): xxx


4 commentaires

Veuillez garder à l'esprit que le guide de style python officiel ( PEP 8 ) 't Vous aimez appeler votre variable ou vos attributs seulthesespervers ; Il préférerait seulement_these_servers ou tel.


n'est pas Aucun sera vrai si vous passez une liste vide, voulez-vous réellement que la condition soit vide ou la variable pour être aucune?


@Chris Morgan: Merci! Je vais regarder à travers elle et adopter. Je suis un peu java-fié. :-)


@Geekfish: j'ai écrit si arg.onlythesespervers n'est pas Aucun: Mais oui, je veux que la condition soit false si seulement eser Merci de l'avoir repéré! Je le change sur si arg.onlythesespervers:


5 Réponses :


0
votes

Appelez-moi fou acheter, j'aime mieux

only = set(args.onlyTheseServers) if args.onlyTheseServers is not None else set(availableServers)


2 commentaires

Je vais vraiment devoir vous appeler fou sur celui-là. ;-) Mais merci d'avoir répondu! Avoir un vote zéro (voter une réponse correcte serait cruelle). :-)


@Kent, hehe. C'est parce que j'ai acheté complètement le cas «un cas» est le commun et devrait être la première »explication donnée dans la documentation de PPE 308. docs.python.org/release/2.5/whatsnew/pep-308.html Vous le lisez uniquement = set (arg.onlythesespervers) ... bla bla certains Cas spécial traité ici ...



1
votes

Pas vraiment meilleur meilleur, mais au moins un peu plus court: xxx

vous pouvez également faire xxx

Ça fonctionne légèrement différent Il ne teste pas pour Aucun , mais uniquement si l'argument est vrai - est - dans ce cas, il devrait fonctionner cependant.


0 commentaires

11
votes
only = set(args.onlyTheseServers or availableServers)

3 commentaires

Cela a une sémantique légèrement différente de celle de l'original. Il peut ou peut ne pas avoir d'importance, mais si arg.onlythesespervers est une liste vide, l'original produit un ensemble vide alors que votre version utiliserait la valeur par défaut.


Vrai, en effet. La sémantique est différente de son exemple de code, mais correspond au titre de la question ("... avec le contenu d'une liste si la liste n'est pas vide ...").


J'ai eu un bug dans mon échantillon de code. Donc, vous l'avez interprété comme je le voulais, malgré mon exemple d'être buggy. Merci!



3
votes

regarder votre précédent Question , je dirais que ce que vous cherchez vraiment, c'est un moyen d'assigner une valeur par défaut à un paramètre manquant à l'aide de argparse . Dans ce cas, vous devriez simplement utiliser par défaut comme suit: xxx

de cette façon, lorsque le -o / - uniquement option isn ' T passé, l'espace de noms aura la valeur par défaut correctement définie.


3 commentaires

Bien remarqué. Je pense que c'est bien ce qu'il veut. Je suis maintenant ennuyé que je ne l'ai pas pensé moi-même ... sans l'avoir connecté avec la question précédente, je avait le connecté avec argpars en raison de la variable nom args !


@Chris Morgan: Eh bien, je suis un questionneur déroutant. Désolé pour ça!


Belle déduction! J'ai résolu la façon dont vous avez suggéré. Cependant, de laisser ma question ici "debout seul" (et d'aider éventuellement à aider quelqu'un d'autre avec elle) je marquais l'autre comme ma réponse préférée. Bien que cela se sent un peu mauvais, si seulement j'avais plus de votes à nouveau à donner. :-)



2
votes

arg.onlytheseservers code> semble une variable provenant de argparse code>.

Si c'est votre cas, vous devriez vérifier le défaut code> argument et le set_default () code> méthode. p>

Voici un exemple: P>

>>> import argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', nargs='*', default=['1', '2', '3'])
>>> args = parser.parse_args()
>>> args.foo
['1', '2', '3']
>>> args = parser.parse_args(['--foo', 'a', 'b'])
>>> args.foo
['a', 'b']


2 commentaires

Belle déduction! J'ai résolu la façon dont vous avez suggéré. Cependant, de laisser ma question ici "debout seul" (et d'aider éventuellement à aider quelqu'un d'autre avec elle) je marquais l'autre comme ma réponse préférée. Bien que cela se sent un peu mauvais, si seulement j'avais plus de votes à nouveau à donner. :-)


@Kent: Ne t'inquiète pas pour ça :) (à l'avenir si vous avez des doutes sur quelle réponse à accepter, ici Il y a une référence)