11
votes

Utilisation de la sortie ArgPart pour appeler des fonctions

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 , seulement comment le configurer. xxx


0 commentaires

3 Réponses :


4
votes

à l'exception de - version code>, qui est très couramment une option, les actions que vous avez fournies sont mieux traitées comme des "sous-communands".

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 svn code> comme exemple, voici un pseudocode pour la ligne de commande: p> xxx pré>

code> in: p> xxx pré>

et code> sont des options spécifiques à cette commander. Utilisation de OptParse (qui est similaire), cela signifierait que votre commande serait renvoyée dans 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:])


3 commentaires

argparse assure en réalité un support pour précisément ce modèle. ( optparse 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 - 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.



11
votes

Vous pouvez fournir une personnalité Action pour un argument de, et je Citation:

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é __ méthode. Le __ appel __ La méthode devrait accepter quatre paramètres:

  1. anal : l'objet ArgumentParser qui contient cette action.
  2. Espace de noms : L'objet Espace de noms qui sera renvoyé par parse_args () . La plupart des actions ajoutent un attribut à cet objet.
  3. valeurs : 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 () . < / li>
  4. option_string : 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.

4 commentaires

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 __ Méthodes de sous-classes appropriées de argpars.action . 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 == 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 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 () ), il n'est donc pas clair à quel point les indicateurs facultatifs pourrait affecter le comportement de l'action personnalisée.



6
votes

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'])


6 commentaires

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 / est toujours vraie? Func 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 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 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 , mais je vais certainement vérifier cela. argh semble être essentiellement un wrapper pour argarse sous-évaluateurs, donc mon ennui avec argarse la nécessité de la chaudrone est toujours.


@Ryneeverettt c'est exactement pourquoi j'ai créé argh 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.