IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Comment gérer une erreur is not defined après n'avoir rien tapé dans une variable raw_input (python 2.7)?


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 44
    Par défaut Comment gérer une erreur is not defined après n'avoir rien tapé dans une variable raw_input (python 2.7)?
    Bonjour à tous, je suis sous Python 2.7 et je voudrais savoir comment gérer dans une boucle une erreur de type variable non defini
    par exemple voici mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # -*- coding: cp1252 -*-
    while 1:
        try:
            multiplieurCapacityint_1 = int(raw_input('1 entrée un nombre pour multiplier la Capacitée par '))
        except ValueError:
            print "Vous n'avez pas entrez un nombre correct pour la multiplication veillez recommencez!"
        if multiplieurCapacityint_1<=0:
            print "Vous n'avez pas entrez un nombre correct pour la multiplication veillez recommencez!"
        else:
            break
    et mon code d'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NameError: name 'multiplieurCapacityint_1' is not defined
    si je tape quel un int non valide, c'est bon le programme ne bug pas, si c'est un int valide il passe à la fin de boucle est la ternime, si c'est pas un int valide <=0 il revient au début de la boucle et l'erreur est correctement gérer, mais que si l'on tape quel chose non int il bug, si l'on ne tape rien ou type str message d'erreur suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NameError: name 'multiplieurCapacityint_1' is not defined
    et le programme plante il quitte tout simplement, et ça je ne peut pas le tollérer, parce que justement raw_input on peut faire ce genre d'erreur de ne rien taper ou taper un type du genre invalide comme type str, et la très vite c'est le drame. Comment donc gérer ce type d'erreur dans une boucle pour ?

    D'avance je vous remercie pour votre aide

    MediaVistaIntel

  2. #2
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonsoir,

    Question de logique. Quelques exemples sur votre code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    #!/usr/bin/env python
    # -*- coding: cp1252 -*-
    #
    #
    while 1:
        try:
            multiplieurCapacityint_1 = int(raw_input('1 entrée un nombre pour multiplier la Capacitée par '))
            if multiplieurCapacityint_1 <= 0:
                print "Vous n'avez pas entrez un nombre correct pour la multiplication veillez recommencez!"
            else:
                break
        except ValueError:
            print "Merci de donner un chiffre. Veillez recommencez!"
    print(multiplieurCapacityint_1)
     
    multiplieurCapacityint_1 = None
    while not multiplieurCapacityint_1:
        try:
            multiplieurCapacityint_1 = int(raw_input('1 entrée un nombre pour multiplier la Capacitée par '))
        except ValueError:
            print "Vous n'avez pas entrez un nombre correct pour la multiplication veillez recommencez!"
    print(multiplieurCapacityint_1)
     
    while 1:
        multiplieurCapacityint_1 = raw_input('1 entrée un nombre pour multiplier la Capacitée par ')
        if multiplieurCapacityint_1.isdigit() and int(multiplieurCapacityint_1) > 0:
            break
        print "Vous n'avez pas entrez un nombre correct pour la multiplication veillez recommencez!"
    print(multiplieurCapacityint_1)
    Etc...
    A vous de voir.

    @+

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 717
    Par défaut
    Salut,

    Il faut essayez de comprendre ce qu'il se passe côté interpréteur et sa logique n'est pas nécessairement la votre.

    En écrivant, "foo = int(...)" l'intention est d'assigner à la variable "foo" l'objet retourné par "int(...)".
    Problème, lorsque int se vautre, on ne sait plus trop quoi assigner à "foo" et... la variable ne sera pas créée.
    Dans ce cas particulier, il est peut être préférable de décomposer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while True:
        s = raw_input(...)
        if s and s.isdigit() # si la chaine est "vide" on n'est pas bien
            v = int(s)
            if v > 0:
                break
    puis d’emballer cela dans une fonction qui vous assure que la variable "multiplieurCapacityint_1" sera affectée avec un objet de type et de valeur attendue.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def get_capacity():
        while True:
            s = raw_input(...)
            if s and s.isdigit() # si la chaine est "vide" on n'est pas bien
                v = int(s)
                if v > 0:
                   break
        return v
    multiplieurCapacityint_1 = get_capacity()
    Enfin c'est vous qui voyez
    Cordialement
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            if s and s.isdigit() # si la chaine est "vide" on n'est pas bien

    raw_input retourne un string et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> ''.isdigit()
    False
    Donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while True:
        s = raw_input('1 entrée un nombre pour multiplier la Capacitée par ')
        if s.isdigit():
            v = int(s)
            if v > 0:
                break
    print v
    Mais comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> None and 1
    >>> 1 and 2
    2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while True:
        s = raw_input('le texte : ')
        if s.isdigit() and int(s) > 0:
            break
    print s
    Non ?

    Edit:
    Ovni
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    OVNI = lambda: True and ((lambda v=raw_input('le texte : '): v.isdigit() and int(v) >= 0 and v)() or OVNI())
    multiplieurCapacityint_1 = OVNI()
    print multiplieurCapacityint_1
    Pardon ? Ok ---> []

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 717
    Par défaut
    Salut,

    La structure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def get_capacity():
        ....
        return v
     
    multiplieurCapacityint_1 = get_capacity()
    définit une fonction "get_capacity" qui retourne un entier "> 0".

    Après on peut regarder les détails de la réalisation, mais le "if s and s.isdigit()" est à mon sens "anecdotique" vs le défaut de traitement du EOF (on fait quoi dans ce cas?).

    Le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while True:
        s = raw_input('le texte : ')
        if s.isdigit() and int(s) > 0:
            break
    print s
    est, certes, plus concis mais retourne un "str" à la place d'un "int".
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    A vrais dire je n'avais pas voulu entrer dans la considération 'fonction' pour le PO mais plus le tourner vers if plutôt que try.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while True:
        s = raw_input('le texte : ')
        if s.isdigit() and int(s) >= 0:
            s = int(s)
            break
    print s
    print type(s)
    Mais la notion de fonction est une chose a retenir pour lui.

    'plus concis': Pas question d’être plus concis mais de montrer if avec and/or. Existe il quelque chose de plus puissant au niveau exécution ?

    PS:
    Petites notes pour le PO.

    Vous voici face à deux faux amis: try/except et while True.

    try/except: J’essaie mon code sinon je laisse tomber... Trop facile.
    Cette déclaration n'est pas là pour tester votre code mais pour parer à une éventuelle erreur d'un 'objet externe'.
    Vous allez me dire c'est ce que je fais (except ValueError) mais non: Par erreur je parle d'une exception venant d'un 'objet externe' à votre code d'on vous ne maîtrisez pas le résultat, le ValueError vous savez qu'il vas se produire. Dans ce cas autant le tester (if).
    Concrètement c'est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        try:
            multiplieurCapacityint_1 = int(raw_input('1 entrée un nombre pour multiplier la Capacitée par '))
        except ValueError:
            print "Vous n'avez pas entrez un nombre correct pour la multiplication veillez recommencez!"
     
        s = raw_input('1 entrée un nombre pour multiplier la Capacitée par ')
        if s.isdigit():
            v = int(s)
    Mais vous allez me dire 'je ne connais pas str.isdigit()'. Ça c'est le métier qui rentre, sinon il reste la doc ou le forum pour demander

    Vous allez me dire 'mais ou utiliser try/except ?'.
    L'exemple le plus simple est la manipulation de fichier. Voici du code venant du module shutil.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                try:
                    os.remove(fullname)
                except os.error, err:
                    onerror(os.remove, fullname, sys.exc_info())
    Rien ne dit que vous pouvez supprimer 'fullname', ou qu'il existe encore, au moment ou vous voulez le supprimer.
    Vous allez me dire 'je teste avec if'
    Mais non:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if os.path.isfile(fullname):
        os.remove(fullname)
    Ici il est plus 'rapide' d'utiliser try, et ne pas risquer une erreur entre temps, que de se perdre dans des tests.
    Note: Capilotracté (dédicace à qui se reconnaîtras) comme exemple ? C'est le plus simple que j'ai trouvé par rapport à des instances ou autre.

    while True(1): Tant que je ne sais pas m'en sortir je n'utilise pas.
    Vous devez TOUJOURS définir comment vous en sortir, soit dans la condition (while unecondition) soit dans le code qui suit (break).

    Maintenant votre erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >>> a = 1
    >>> b = 0
    >>> try:
    ...     c = a / b
    ... except ZeroDivisionError:
    ...     pass
    ... 
    >>> c
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    NameError: name 'c' is not defined
    Ici le code suivant le try est testé sinon c'est celui d'except qui est exécuté.

    Les basiques : and/or
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >>> 0 and 1
    0
    >>> 1 and 0
    0
    >>> 0 or 1
    1
    >>> 1 or 0
    1
    >>> 0 and 0 or 1
    1

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 44
    Par défaut
    Rebonjour, tous le monde et un grand merci pour vos explication et vos point de vue, et merci à toi PauseKawa pour tes codes, voici celui que j'ai choisi
    Citation Envoyé par PauseKawa Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/usr/bin/env python
    # -*- coding: cp1252 -*-
    #
    #
    while 1:
        try:
            multiplieurCapacityint_1 = int(raw_input('1 entrée un nombre pour multiplier la Capacitée par '))
            if multiplieurCapacityint_1 <= 0:
                print "Vous n'avez pas entrez un nombre correct pour la multiplication veillez recommencez!"
            else:
                break
        except ValueError:
            print "Merci de donner un chiffre. Veillez recommencez!"
    et à oui la variable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    multiplieurCapacityint_1
    et ultiliser pour int direct et aussi pour type str si valide bien sur comme ceci par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    multiplieurCapacityint_1_str=str(multiplieurCapacityint_1)
    c'est un exemple de comment je mais mon code à quel chose près c'est la même chose.

    Et je vois aussi que mon topic à fait débat pour ça (les erreurs de champ vide raw_input en variable), constant de voir que ça anime!

  8. #8
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Dommage,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    while True:
        s = raw_input('1 entrée un nombre pour multiplier la Capacité par ')
        if s.isdigit() and int(s) >= 0:
            multiplieurCapacityint_1 = int(s)
            break
        print "Vous n'avez pas entrez une valeur correcte pour la multiplication veillez recommencez!"
    Est largement plus propre à mon sens.
    Je me console en me disant que vous relirez ce post plus tard.

    @+

  9. #9
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Salut,

    Puisqu'on parle de propreté, ne serait-pas mieux avec les conditions imbriquées? Python teste peut-être en premier la condition la plus à gauche, mais ce n'est pas obligatoire en logique pure. Avec un compilo C, je crois me rappeler que l'ordre de test n'est pas imposé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while True:
        s = raw_input('1 entrée un nombre pour multiplier la Capacité par ')
        if s.isdigit():
            if int(s) >= 0:
                multiplieurCapacityint_1 = int(s)
                break
        print "Vous n'avez pas entrez une valeur correcte pour la multiplication veillez recommencez!"
    A+

    Pfeuh

  10. #10
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    Citation Envoyé par pfeuh Voir le message
    Avec un compilo C, je crois me rappeler que l'ordre de test n'est pas imposé.
    On fait plus que friser la HS, là, mais il me semble bien que si, du moins pour la version moderne du C (C99 si je ne m’abuse).

    En tout cas, dans Blender, on a pléthore de trucs genre

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    if (ptr && ptr->foo) do_bar();

    Ce qui implique que la première condition (le pointeur n’est pas NULL) est évaluée avant la seconde… Confirmé d’ailleurs par ceci: http://stackoverflow.com/questions/6...aluation-order

    Pour en revenir à python (doc officielle de py3.2)*:
    Python evaluates expressions from left to right. Notice that while evaluating an assignment, the right-hand side is evaluated before the left-hand side.
    Et pareil pour Java, apparemment… Donc à quelques rares exceptions près (en C++), l’évaluation se fait toujours de gauche à droite au strict minimum pour les opérations logiques… ce qui est logique*!

  11. #11
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 717
    Par défaut
    Salut,

    Citation Envoyé par pfeuh Voir le message
    Puisqu'on parle de propreté, ne serait-pas mieux avec les conditions imbriquées? Python teste peut-être en premier la condition la plus à gauche, mais ce n'est pas obligatoire en logique pure. Avec un compilo C, je crois me rappeler que l'ordre de test n'est pas imposé.
    Les affinités de Python avec C sur ce sujet font que je ne comprends pas trop la remarque sur l'ordre des tests.

    Dans tous les cas, il y a souvent un compromis à trouver entre lisibilité et efficacité. A défaut de "standards" style PEP8, la lisibilité est "subjective" alors que l'efficacité pourrait se mesurer.

    Ceci dit j'ai toujours eu quelques difficultés à comprendre des recherches trop poussées d'un style de codage plus "efficace" lorsqu'on programme en Python.

    Si on fait un gros truc, on essayera d'optimiser certains traitements et non tous les blocks/fonctions. On essaiera de mesurer le coûts de certaines construction par rapport à d'autres équivalentes si cela est "brique de base".
    A la limite, une partie pourra être ré-écrite en C.

    Python est surtout efficace pour que le programmeur réalise un prototype assez rapidement. "Optimiser" dépendra de l'utilisation, de l'intérêt du prototype.
    Note: Un prototype permet aussi de valider des choix fonctionnels... Après c'est "poubelle".

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 12
    Dernier message: 20/03/2015, 10h27
  2. Réponses: 5
    Dernier message: 12/03/2015, 16h32
  3. [Débutant]Comment gérer les erreurs simplement ?
    Par nahouto dans le forum Langage
    Réponses: 3
    Dernier message: 29/11/2006, 21h55
  4. erreur function not defined
    Par reventlov dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 03/04/2006, 01h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo