2017-09-30 3 views
-1

J'accepte deux chaînes word1 et word2, via une ligne de commande qui ne doit contenir que des alphabets.Les arguments de ligne de commande Python en classe ne fonctionnent pas

La fonction check_conditions s'assurera que les chaînes sont pour les alphabets seulement.

Lorsque j'exécute ce programme sous python myprogram.py 'word1' 'word2', il ne montre rien, aucune erreur, aucune sortie. Lorsque j'exécute ce programme sans utiliser de classe, cela fonctionne comme une exception.

class FindWinner: 
    def __init__(self, word1, word2): 
     self.word1 = word1 
     self.word2 = word2 

def check_conditions(self): 
    special_chars = set('[[email protected]#$%^&*.-()_+{}":;\']+$') 
    if special_chars.intersection(self.word1) or special_chars.intersection(self.word1) or (len(self.word1) != len(self.word2) 
or ('no' in self.word1) or ('no' in self.word2)): 
     print('Invalid string.') 
    else: 
     print("String is valid") 
     print(list(self.word1)) 
     print(list(self.word2)) 


def main(): 
    parser = argparse.ArgumentParser() 
    parser.add_argument("word1", help="First word") 
    parser.add_argument("word2", help="Second word") 
    args = parser.parse_args() 

    c1 = FindWinner(args.number1, args.number2) 
    c1.check_conditions() 

Que manque-t-il ici?

EDIT I Missed appeler main()

if __name__ == "__main__": 
    main() 

Maintenant, je reçois une autre erreur:

if special_chars.intersection(self.word1) or special_chars.intersection(self.word1) or (len(self.word1) != len(self.word2) or ('no' in self.word1) or ('no' in self.word2)):

Quand je lance python myprogram.py my_string my_long_string, il me donne string is valid sortie (autre partie). Conformément à la condition ci-dessus, les deux chaînes ne doivent pas contenir de caractère spécial & len devrait être le même.

+0

Appelez-vous 'main()' n'importe où? – Will

Répondre

3

Vous devriez appeler la fonction principale de votre code puisque vous l'avez défini ne l'a pas appelé. La façon habituelle de faire cela en ajoutant les lignes suivantes au bas de votre code.

if __name__ == '__main__': 
    main() 
+0

Merci sdvd. Ça a marché. Maintenant, je reçois une autre erreur AttributeError: l'objet 'Namespace' n'a pas d'attribut 'number1' – PRK

+0

Au lieu de 'number1' et 'number2' utilisez 'word1' et 'word2' – sdvd

+0

J'ai raté pour renommer. Merci beaucoup sdvd. Lorsque j'exécute myprogram python.py my_string my_long_string, il me donne la chaîne est sortie valide (sinon partie). Conformément à la condition ci-dessus, les deux chaînes ne doivent pas contenir de caractères spéciaux. – PRK

0

Pour disserter sur la réponse de @ SDVD, les lignes

if __name__ == “__main__”: 
    main() 

vérifie si le script est appelé directement par l'interprète ou si elle est importée. Si le script est importé, la fonction principale n'est pas exécutée, car il est probable que vous ne souhaitiez pas exécuter le script immédiatement. Si le script est appelé directement par l'interpréteur, vous voulez exécuter la fonction principale immédiatement, ce qui se produit lorsque cette expression est évaluée à true.

Dans votre script maintenant, il n'y a aucun appel à la fonction principale, donc rien ne se passe. Ajoutez les lignes ci-dessus au bas de votre script, et les choses devraient continuer comme vous le souhaitez.

Pour accéder à vos arguments, utilisez args.word1 et args.word2 au lieu de args.number1 et args.number2 parce que c'est ce que vous les avez nommés.

+0

Merci pour votre contribution Steampunkery. J'ai modifié le programme comme suggéré par sdvd. – PRK

+0

Je n'ai aucune expérience en utilisant ArgParser, mais un coup d'œil rapide sur les docs me dit que vous avez des arguments nommés «word1» et «word2». Je crois que vous pouvez y accéder comme suit: 'args.word1' et' args.word2'. J'ai édité ma réponse pour refléter cela. – Steampunkery

0

Vous nommez l'argument une chose et l'utiliserez plus tard avec un autre nom.

Essayez d'utiliser args.word1 et args.word2, ou appelez-number1 et number2 lorsque vous les ajoutez (en utilisant add_argument).