comment passer argparse des arguments à une classe
Je suis très nouveau pour le codage en général et Python en particulier. Je suis en train d'apprendre comment passer argparse arguments, j'ai créé une classe pour utiliser le droit de recommander ou de manière. En plus de l'apprentissage de python, je suis en train d'apprendre comment faire les choses en programmation orientée objet, de sorte que l'apprentissage d'autres, de la programmation orientée objet-type de langues un peu plus facile.
Alors, voici un échantillon de ce que je suis en train de faire:
import argparse
class passyourcliargstome():
def __init__(self, whatdoiputheretogetmycliargs):
#how do I get my cli args here?
pass
def otherfunctionsthatdothings():
pass
if __name__ == '__main__':
#grab the arguments when the script is ran
parser = argparse.ArgumentParser(
description='Make things happen.')
parser.add_argument('-f', '--foo', action='store_true', default=False, help='here be dragons')
parser.add_argument('-b', '--bar', action='store_true', default=False, help='here be more dragons')
passyourcliargstome.otherfunctionsthatdothings()
Donc, je suis à la définition de argparse arguments à l'extérieur de la classe principale, et vous voulez savoir comment obtenir à l'intérieur de la classe. Est-ce vraiment la bonne façon de le faire? dois-je simplement faire argparse une fonction en vertu de ma classe?
Je vous remercie d'avance pour toute aide, références, etc.
Edit: 11/16 2:18 HNE
Remarque: Puisque je n'ai pas assez de rep pour répondre à ma propre question, c'est mon seul recours pour poster une réponse appropriée.
Bon, il m'a fallu le faire, mais j'ai trouvé cet ensemble. RyPeck réponses m'ont aidé à obtenir mes arguments (quelque chose que mon code est manquante), mais ensuite j'ai été d'être indépendant de la méthode des erreurs Quand j'ai essayé de tester le code. Je n'avais aucune idée de ce que cela signifiait. Ai-je mentionné que je vis jusqu'à l'écran de mon nom?
Il n'a pas vraiment cliquez jusqu'à ce que j'ai trouvé et lu cette. Voici mon code de travail. Si quelqu'un a quelque chose à ajouter à ce, jusqu'à et y compris "Vous êtes toujours de faire le mal, faire de cette façon, le droit chemin." Je suis toutes les oreilles. En attendant, merci pour votre aide.
import argparse
class Passyourcliargstome(object):
def __init__(self):
#here's how I got my args here
self.foo = args.foo
self.bar = args.bar
def otherfunctionsthatdothings(self):
print "args inside of the main class:"
print self.foo
print self.bar
if __name__ == '__main__':
#grab the arguments when the script is ran
parser = argparse.ArgumentParser(description='Make things happen.')
parser.add_argument('-f', '--foo', action='store_true', default=False, help='here be dragons')
parser.add_argument('-b', '--bar', action='store_true', default=False, help='here be more dragons')
args = parser.parse_args()
print "args outside of main:"
print args.foo
print args.bar
#this was the part that I wasn't doing, creating an instance of my class.
shell = Passyourcliargstome()
shell.otherfunctionsthatdothings()
L'exécution de ce code sans arguments des impressions Fausses quatre fois. deux fois à l'extérieur de l'instance de classe, à deux reprises au sein de l'instance de classe.
args
comme un argument de la classe __init__
, plutôt qu'en fonction de l'être global.OriginalL'auteur some_noob | 2013-11-16
Vous devez vous connecter pour publier un commentaire.
Utilisation
parser.parse_args
et l'envelopper avecvars
pour convertir le spécial argparse espace de Noms type régulier de Python dict. En général, vous voulez ce modèle:Après cela, vous pouvez passer des arguments explicitement ou tous à la fois, quelle que soit la classe ou de fonction. Pour une classe, il est préférable d'écrire les arguments requis explicitement. Comme:
Maintenant, vous pouvez mettre les deux ensemble comme ceci:
Les deux
c1
etc2
sera créé. La meilleure approche est de créer des classes explicitement, comme on le fait avecc1
.Je suppose que c'est juste une préférence. Je dis "mieux" pour des raisons de maintenabilité, comme, en général, des autres la lecture de votre classe (éventuellement de l'étendre) aura un temps plus facile de voir ce qu'il fait et comment ne pas casser des choses si ils sont écrits de façon explicite, vs fantaisie méta-traitement avec **kwargs, *args, setattr(), etc. Ce n'est pas une règle absolue. Utilisez votre meilleur jugement.
De bons points à prendre en considération. Merci.
OriginalL'auteur Dave
Un simple
for
boucle peut passer argument (ou vos attributs):mais... peut-être la manière élégante serait d'initialiser votre classe avec
argparse
et les mettre directement à la classe par espace de noms:une entrée vide est équivalent à:
OriginalL'auteur Assaf-g
Vous devez faire ce qui suit après l'ajout de vos arguments.
Si vous faites une impression sur args, vous verrez que vous avez tous les arguments dans un espace de noms argument.
Vous pouvez ensuite y accéder comme
À partir de là, vous pouvez les traiter comme des variables normales. Voir la argparse documentation pour plus de détails et plus d'info.
En dehors de la classe. Vous pouvez ensuite passer des arguments à la classe. Vous souhaitez analyser l'ensemble de vos arguments en main. Prenez le temps de consulter la documentation, il sera clair tout pour vous.
Je vais regarder en arrière et rire un jour. Vous me dites la variable args est adoptée dans la déclaration de classe? donc:
class passyourcliargstome():
devient:class passyourcliargstome(object, args):
Lire sur les classes. À l'expliquer, via les commentaires ne va pas être facile. docs.python.org/2/tutorial/classes.html
OriginalL'auteur RyPeck