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

  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

  12. #12
    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
    Bonjour,

    Pour rappel le and n'est pas vraiment là pour un gain de performance ou toute autre considération de lisibilité mais bien pour introduire pour le PO une comparaison booléenne plutôt que deux instructions if à la suite.
    Citation Envoyé par PauseKawa Voir le message
    'plus concis': Pas question d’être plus concis mais de montrer if avec and/or.
    Que ce soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    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!"
    Ou
    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!"
    Comme le dit wiztricks ce n'est sûrement pas ce genre de code qui vas être coûteux.
    Un ajout inutile ici et trompeur dans le sens ou cela demande des explications plus pointues (1, 2) ? Sans doute.

    Le but véritable était ici de montrer à MediaVistaIntel son code avec if plutôt que try, pour les raisons évoquée plus haut. Vous remarquerez que dans les exemples (sorry MediaVistaIntel) j'ai éviter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    while 1:
        multiplieurCapacityint_1 = raw_input('1 entrée un nombre pour multiplier la Capacitée par ')
        try:
            multiplieurCapacityint_1 = int(multiplieurCapacityint_1)
        except ValueError:
            print "Merci de donner un chiffre. Veillez recommencez!"
        else:
            if multiplieurCapacityint_1 >= 0:
                break
            print "Un nombre positif svp. Veillez recommencez!"
    Ce qui aurais été un code 'acceptable' (ce qui veux dire en fait ?) vu que cela ne cache pas une autre erreur possible.
    Malhonnête d'utiliser l'erreur de MediaVistaIntel pour cela ? Je ne pense pas vu qu'aucun de vous n'est revenu sur l'utilisation de if.

    Citation Envoyé par wiztricks Voir le message
    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.
    Je convient que tout cela semble inutile mais ma considération ici est l'utilisation des bons outils dés le début.
    Vous me trouvez trop radical pour ce qui est de l'utilisation de try ?

    @+

  13. #13
    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
    Citation Envoyé par wiztricks Voir le message
    Les affinités de Python avec C sur ce sujet font que je ne comprends pas trop la remarque sur l'ordre des tests.
    Ce que je voulais dire c'est que cela fonctionnera:
    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!"
    Mais cela bien évidemment pas:
    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 int(s) >= 0:
            if s.isdigit():
                multiplieurCapacityint_1 = int(s)
                break
        print "Vous n'avez pas entrez une valeur correcte pour la multiplication veillez recommencez!"
    Alors avec deux tests sur la même ligne, il ne me parait pas incongru de se poser la question. Sauf qu'au lieu de sauter sur le mot "propreté", j'aurais du utiliser "lisibilité" ou "clarté".

  14. #14
    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 pfeuh Voir le message
    Alors avec deux tests sur la même ligne, il ne me parait pas incongru de se poser la question.
    Pas vraiment
    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
    >>> def foo():
    ...     print 'foo'
    ...     return True
    ... 
    >>> def foo1():
    ...     print 'foo1'
    ... 
    >>> if foo() and foo1():
    ...     print 'ok'
    ... 
    foo
    foo1
    >>> if foo1() and foo():
    ...     print 'ok'
    ... 
    foo1
    >>> if foo() and foo():
    ...     print 'ok'
    ... 
    foo
    foo
    ok
    Voir les liens 1 et 2.

  15. #15
    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
    Alors avec deux tests sur la même ligne, il ne me parait pas incongru de se poser la question.
    Disons que la construction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        if s.isdigit():
            if int(s) >= 0:
               *block*
    équivaut à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        if s.isdigit() and int(s) >= 0:
               *block*
    Cette équivalence est documentée et PauseKawa en a donné moultes illustrations.

    Pour ce cas particulier, je n'aime pas cette construction.
    Dans le cas ou la condition est "vraie", elle coûte un deuxième appel à int(s). Je lui préfère:
    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(): 
                v = int(s)
                if v > 0:
                   break
    PauseKawa a raison de faire remarquer que tester "s" est inutile.
    Mais, cela "documente" (me rappelle) les 3 conditions identifiées:
    • chaine vide,
    • contient des digits,
    • est positif,

    (et l'omission du cas EOF).
    Cela oblige à "structurer" le code en conséquence.

    La "lisibilité" étant "subjective", les avis peuvent être différents et tout aussi "sensés", "fondés", ...

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

  16. #16
    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
    Bonjour,

    Je dois bien avouer que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if int(s) >= 0:
        v = int(s)
    c'est moche.
    Non pas une considération sur la performance du code avec les deux load global d'int inutiles mais dans la forme.

    Vu sous cet angle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if s and s.isdigit(): 
        v = int(s)
        if v > 0:
            break
    parait plus attrayant (hors considération pour if s), même avec ses deux blocs.
    Enfin, du moment ou on n'en arrive pas à des
    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 (locals().setdefault('v', int(s)) or 1) and v >= 0:
            break
        print "Vous n'avez pas entrez une valeur correcte pour", \
              "la multiplication veillez recommencez!"
    print v
    (Pas taper sur les doigts pour le namespace... Ce n'est qu'un exemple bidon sur l'idée du sujet)
    and est sans doute a retenir mais peut être pas dans le cas présent.

    Maintenant je suis étonné que personne ne réagisse sur le fait que MediaVistaIntel ai choisi une de mes 'merveilles' de code. De même l'utilisation de try ne semble pas vous gêner...

    @+

  17. #17
    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 PauseKawa Voir le message
    Maintenant je suis étonné que personne ne réagisse sur le fait que MediaVistaIntel ai choisi une de mes 'merveilles' de code. De même l'utilisation de try ne semble pas vous gêner...
    Ah ben, à la lecture de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    multiplieurCapacityint_1_str=str(multiplieurCapacityint_1)
    il est clair que le PO a du chemin à faire.
    Aujourd'hui, il avait un problème et à choisit la variante avec laquelle, il est le plus "confortable".
    A ne pas exclure non plus que le PO soit "étudiant" et tenu de montrer qu'il a bien acquis certaines constructions du langage plutôt que de faire le malin avec x.isdigit...
    Allez savoir...

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

  18. #18
    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
    Citation Envoyé par wiztricks Voir le message
    Salut,



    Ah ben, à la lecture de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    multiplieurCapacityint_1_str=str(multiplieurCapacityint_1)
    il est clair que le PO a du chemin à faire.
    Aujourd'hui, il avait un problème et à choisit la variante avec laquelle, il est le plus "confortable".
    A ne pas exclure non plus que le PO soit "étudiant" et tenu de montrer qu'il a bien acquis certaines constructions du langage plutôt que de faire le malin avec x.isdigit...
    Allez savoir...

    - W
    le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    multiplieurCapacityint_1_str=str(multiplieurCapacityint_1)
    est un exemple et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    multiplieurCapacityint_1
    c'est parce que j'ai plusieurs truc comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    multiplieurCapacityint_#
    12 pour être exact ici dossier Cities XL msn de MediaVistaIntel vous avez dans le fichier Cities XL programme de modifications.7z dossier Cities XL multiplieurs batiments densitée et Cities XL multiplieurs batiments densitée float 2 mode on va dire, le simple qui traitre 1 multiples à la fois, et la douzaine qui traitre 12 multiples à la fois, et justement la douzaine dans les fichiers du nom Cities XL Rapide Multiplieurs grouper 1.py Cities XL Rapide Multiplieurs grouper 2.py etc jusqu'à Cities XL Rapide Multiplieurs grouper 12.py
    on le même code à quel chose prêt
    pour le 1
    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
    30
    # -*- coding: cp1252 -*-
    #Multiplieurs
    multiplieurCapacity = str(multiplieurCapacityint_1)
    multiplieurCapacityint = (multiplieurCapacityint_1)
    for root, dirs, files in os.walk(source):
        for fn in irec_glob('*.*', source):
            nom_variable_partie='t' + taille_buildings + '/' + Cities_XL_folder + 'X' + multiplieurCapacity + ' XL ' + Cities_XL_Version
            dirname = os.path.dirname(fn)
            dirnametemp = Re_sourceDir + 'temp/' + nom_variable_partie + '/' + dirname[longueur_Dir:]
            dirname2 = Re_sourceDir + nom_variable_partie + '/' + dirname[longueur_Dir:]
            basename = os.path.basename(fn)
            split = os.path.split(fn)
            splitdrive = os.path.splitdrive(fn)
            splitext = os.path.splitext(fn)
            fichierchemintemp = Re_sourceDir + 'temp/' + nom_variable_partie + '/' + fn[longueur_Dir:]
            fichierchemin = Re_sourceDir + nom_variable_partie + '/' + fn[longueur_Dir:]
            fichieropen = open(fn, "r")
            fichierread = fichieropen.read() #Lit tout le fichier d'un coup
            condiction = re.search(taille_buildings_regex, fichierread)
            condiction2 = re.search(buildings_regex, fichierread)
            if condiction and condiction2:
                print fn
                execfile(Cities_XL_Sous_programme_python)
            else:
                fichieropen.close()
        break
    dossiers_vers_patch = Re_sourceDir + 't' + taille_buildings + '/' + Cities_XL_folder + 'X' + multiplieurCapacity + ' XL ' + Cities_XL_Version
    patch_depuis_dossiers = dossiers_vers_patch + ".patch"
    subprocess.call(["../citiesXL_PAK_util.exe", "M2", dossiers_vers_patch, patch_depuis_dossiers])
    shutil.rmtree(dossiers_vers_patch)
    pour le 2
    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
    30
    # -*- coding: cp1252 -*-
    #Multiplieurs
    multiplieurCapacity = str(multiplieurCapacityint_2)
    multiplieurCapacityint = (multiplieurCapacity_2)
    for root, dirs, files in os.walk(source):
        for fn in irec_glob('*.*', source):
            nom_variable_partie='t' + taille_buildings + '/' + Cities_XL_folder + 'X' + multiplieurCapacity + ' XL ' + Cities_XL_Version
            dirname = os.path.dirname(fn)
            dirnametemp = Re_sourceDir + 'temp/' + nom_variable_partie + '/' + dirname[longueur_Dir:]
            dirname2 = Re_sourceDir + nom_variable_partie + '/' + dirname[longueur_Dir:]
            basename = os.path.basename(fn)
            split = os.path.split(fn)
            splitdrive = os.path.splitdrive(fn)
            splitext = os.path.splitext(fn)
            fichierchemintemp = Re_sourceDir + 'temp/' + nom_variable_partie + '/' + fn[longueur_Dir:]
            fichierchemin = Re_sourceDir + nom_variable_partie + '/' + fn[longueur_Dir:]
            fichieropen = open(fn, "r")
            fichierread = fichieropen.read() #Lit tout le fichier d'un coup
            condiction = re.search(taille_buildings_regex, fichierread)
            condiction2 = re.search(buildings_regex, fichierread)
            if condiction and condiction2:
                print fn
                execfile(Cities_XL_Sous_programme_python)
            else:
                fichieropen.close()
        break
    dossiers_vers_patch = Re_sourceDir + 't' + taille_buildings + '/' + Cities_XL_folder + 'X' + multiplieurCapacity + ' XL ' + Cities_XL_Version
    patch_depuis_dossiers = dossiers_vers_patch + ".patch"
    subprocess.call(["../citiesXL_PAK_util.exe", "M2", dossiers_vers_patch, patch_depuis_dossiers])
    shutil.rmtree(dossiers_vers_patch)
    etc, ce pour tous les 12 fichiers ce qui change juste c'est ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    multiplieurCapacity = str(multiplieurCapacityint_1)
    multiplieurCapacityint = (multiplieurCapacity_1)
    pour le 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    multiplieurCapacity = str(multiplieurCapacityint_2)
    multiplieurCapacityint = (multiplieurCapacity_2)
    pour le 2, et ce jusqu'aux 12. Pourquoi? Parce que dans les 12 fichiers dans la boucle FOR de chaque fichier, le sous dossier Cities XL Sous programme python et Cities XL MaxJobPerCulture, je mais pas besoin comme ça de remettre une variable suplémantaire et donc je peut réutiliser les fichier des sous dossiers puisque il on les même variable.
    bien sur la version float du dossier c'est pour la version à virgules du programme!

  19. #19
    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,

    J'ai pris un peu de temps d'aller farfouiller dans vos sources.

    Si vous avez un peu de temps:
    - essayez de comprendre ce qu'est un "module",
    - utilisez "import" à la place "d'exec",
    - créez une fonction chaque fois que le "cut&paste" vous démange
    - évitez d'utiliser des variables globales.

    et justement la douzaine dans les fichiers du nom Cities XL Rapide Multiplieurs grouper 1.py Cities XL Rapide Multiplieurs grouper 2.py etc jusqu'à Cities XL Rapide Multiplieurs grouper 12.py
    Ils sont apparemment tous identiques excepté les premières lignes qui initialisent les variables globales:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    multiplieurCapacity = str(multiplieurCapacityfloat_1)
    multiplieurCapacityfloat = (multiplieurCapacityfloat_1)
    Plutôt que d'avoir 12 fichiers, vous pourriez avoir une seule fonction toto(multiplieurCapacityfloat).
    Enfin c'est vous qui voyez.

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

  20. #20
    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
    Citation Envoyé par wiztricks Voir le message
    Salut,

    J'ai pris un peu de temps d'aller farfouiller dans vos sources.

    Si vous avez un peu de temps:
    - essayez de comprendre ce qu'est un "module",
    - utilisez "import" à la place "d'exec",
    - créez une fonction chaque fois que le "cut&paste" vous démange
    - évitez d'utiliser des variables globales.



    Ils sont apparemment tous identiques excepté les premières lignes qui initialisent les variables globales:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    multiplieurCapacity = str(multiplieurCapacityfloat_1)
    multiplieurCapacityfloat = (multiplieurCapacityfloat_1)
    Plutôt que d'avoir 12 fichiers, vous pourriez avoir une seule fonction toto(multiplieurCapacityfloat).
    Enfin c'est vous qui voyez.

    Bon courage
    - W
    Pourquoi éviter les variable globales, c'est quoi la fonction toto, et que n'aporte import par raport à exec? exec le fichiers est défini par rapore à une variable (pour certains seulement) pour le chemin complet relatif à partir du dossier du programme principal, exec ne permet d'avoir des sous fichiers et moins de lignes dans mon fichier principal, surtout pour les trucs qui ce répètes beaucoup ou même comme ça. Je ne vois pas le mal qu'il y a à ça?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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