Actuellement, mon code ressemble à ceci. Cela me permet d'analyser plusieurs paramètres mon script de programme obtient. Y a-t-il une manière différente de «meilleures pratiques»? Je n'ai pas vu de code en utilisant la sortie de argparse code>, seulement comment le configurer.
3 Réponses :
à l'exception de Je suis ignorant de l'argar el Spécificités, car je n'ai pas encore essayé de Python 2.7, mais vous pouvez regarder la commande où et - version code>, qui est très couramment une option, les actions que vous avez fournies sont mieux traitées comme des "sous-communands".
svn code> comme exemple, voici un pseudocode pour la ligne de commande: p>
args code>, lors de l'appelant
parse_args code>, vous permettant de faire quelque chose comme ceci: p>
opts, args = parser.parse_args()
if opts.version:
...
else:
getattr("do_" + args[0])(*args[1:])
argparse code> assure en réalité un support pour précisément ce modèle. (
optparse code> ne le fait pas.) Je suis toujours coincé sur Python 2.6 moi-même, je ne connais donc pas les détails hors tension non plus, mais ils sont expliqués dans le Documentation .
Quel serait l'avantage de le faire au lieu de simplement supprimer le - code> de mes arguments. J'imagine à l'utilisateur final, il finirait de regarder la même chose, non? Je suppose que cela ressemblait à cela aurait plus de sens pour l'utilisateur aussi bien que B / C, ils ne fonctionnent pas vraiment le programme avec des paramètres personnalisés, mais leur disant plutôt de faire quelque chose.
@ VLAD003: C'est vrai. L'utilisateur du programme doit sélectionner une et une seule de ces "options", donc vraiment des commandes à votre programme. Ces commandes sont cependant potentiellement des arguments. Une alternative consiste à écrire des scripts exécutables séparés pour chaque commande, exécutez ARG analyse séparément dans chacune d'elles et appelez une base de code commun pour la mise en œuvre. Par exemple, vos scripts peuvent être appelés: la liste MyProg, MyProg-Ajouter, etc. Cependant, j'ajouterais peut-être, comme vous utilisez Argparse à partir de Python-2.7, qu'il pourrait y avoir très malgré la gestion de l'argumentation très fantaisie déjà intégrée à cela.
Vous pouvez fournir une personnalité Action pour un argument de, et je Citation: P>
transmettre un objet qui implémente le API d'action. Le moyen le plus simple de le faire est d'étendre argparse.action, fournir un
__ approprié __ code> méthode. Le
__ appel __ code> La méthode devrait accepter quatre paramètres: p>
anal strong>: l'objet ArgumentParser qui contient cette action. Li> Espace de noms strong>: L'objet Espace de noms qui sera renvoyé par parse_args () code>. La plupart des actions ajoutent un attribut à cet objet. LI>
valeurs forts>: la ligne de commande associée argense, avec toutes les conversions de type appliquées. (Les conversions de type sont spécifiées avec l'argument de mots-clés de type sur add_argument () code>. < / li>
- option_string strong>: la chaîne d'option utilisée pour invoquer cette action. L'argument Option_string est facultatif et sera absent si l'action est associée à un argument de position. LI> ol> blockQuote>
Dans quelles situations serait-elle la meilleure méthode? Je ne peux pas voir une utilisation pour tout ce code supplémentaire. Mais là encore, j'ai à peine utilisé des cours donc je manque probablement quelque chose.
@Vlad, il peut être utilisé pour appeler automatiquement une fonction lorsqu'un argument est fourni, ce que vous faites, ce que vous effectuez tout votre chapeau de chaudière - vous devez simplement faire que les fonctions soient le __ appel __ code> Méthodes de sous-classes appropriées de
argpars.action code>. Mais si vous n'avez pas "obtenez" la programmation orientée objet, c'est correct, vous pouvez le faire de votre chemin (bien que cette boucle et
si x == code> Les chèques sont vraiment redondants dans tous les cas - il suffit de faire un Après l'autre, les contrôles des arguments sont présents éventuellement suiveurs par les appels appropriés, il n'y a pas de valeur ajoutée dans l'autre chaudron que vous utilisez).
Accepté cette réponse parce qu'elle répond à ma question. Je pourrait i> finir par essayer de savoir comment cela fonctionne; Mais cela nécessitera de nombreux changements dans la manière dont mon code fonctionne actuellement (en particulier les fonctions énumérées). Merci!
J'aime la propreté de cette approche, mais la limitation est que l'action personnalisée commence avant que les arguments restants soient analysés (c.-à-d. Ils ne sont pas dans Espace de noms () code>), il n'est donc pas clair à quel point les indicateurs facultatifs pourrait affecter le comportement de l'action personnalisée.
voir http://docs.python.org/library/argparse.html # sous-commandes :
Un moyen particulièrement efficace de traitement des sous-commandes consiste à combiner l'utilisation de la méthode
add_subparsers () code> avec des appels vers
set_default () code> afin que chaque sous-évaluateur sait que chaque sous-programme fonctionner doit exécuter. p> blockQuote>
en un mot: p>
xxx pré> ici Nous créons un sous-programme pour la commande
get-temps code> et attribuez la fonction
get_weather code> à celui-ci. p>
Notez que la documentation indique que le mot-clé / attribut est nommé
func code> mais il est définitivement
fonction code> comme d'argparts 1.1. P>
Le code résultant est un peu trop wordy, donc j'ai publié un petit paquet "Argh" qui rend les choses plus simples, par exemple: p>
parser = argparse.ArgumentParser() add_commands(parser, [get_weather]) print dispatch(parser, ['get-weather', '--bar', 'quux'])
Concernant la récente modification de Caffinatedmonkey ("Je ne laisserai pas cette pile de réponses débordement" → "Je laisserai le débordement de la pile répondant à"). La nouvelle version sonne bien mais je voulais réellement que la réponse devienne gonflée si j'avais beaucoup d'informations dans la Textarea. =)
Êtes-vous sûr que la fonction Func code> /
code> est toujours vraie?
Func CODE> Fonctionne bien pour moi ...
Non seulement l'approche sous-visée est laideuse, mais il semble simplement réussir la tâche d'argumentation à un niveau inférieur - vous devez avoir une fonction distincte pour passer à chaque Func code> qui appelle ensuite votre "réel «Les fonctions, ou vos fonctions réelles doivent prendre la dicte générique arguments. Je suppose que le premier est bon pour les grands programmes, mais il semble ridicule d'introduire tant de couches supplémentaires à un petit programme. Tout de même, les sous-évaluateurs semblent comme la meilleure option jusqu'à présent.
@RYNEEVERETT en fait que argh i> Bibliothèque prend en charge les fonctions de python ordinaire en tant que commandes en intriguant de leurs signatures, aucune fonction d'emballage muette n'est requise.
Ma critique n'a pas été nivelée à Argh i>, mais je vais certainement vérifier cela. argh i> semble être essentiellement un wrapper pour argarse i> sous-évaluateurs, donc mon ennui avec argarse i> la nécessité de la chaudrone est toujours.
@Ryneeverettt c'est exactement pourquoi j'ai créé argh i> en premier lieu :) argparse est très puissant mais a une API maladroit qui est difficile à utiliser et à vous rappeler. D'où l'abondance de divers emballages et alternatives.