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 :

Récupération de ValueError


Sujet :

Python

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 39
    Par défaut Récupération de ValueError
    Bonjour,
    je cherche à récuperer la valeur qui a entrainée une ValueError. Quelqu'un a t-il une solution à ce problème.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> int('cb')
    Traceback (most recent call last):
      File "<pyshell#81>", line 1, in <module>
        int('cb')
    ValueError: invalid literal for int() with base 10: 'cb'
    Je souhaite récupérer 'cb' de manière séparée. Est ce possible ?

    Cordialement

  2. #2
    Membre averti
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2012
    Messages : 39
    Par défaut
    Bonjour,

    Avec un try et except ValueError... ça devrait faire l'affaire non ?

    Etienne

  3. #3
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 060
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 060
    Par défaut
    Vous pouvez utiliser le bloc try except

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    try:
        int('cb')
    except ValueError:
        print('cb')

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 39
    Par défaut
    Citation Envoyé par sir_nebuchadnezzar Voir le message
    Bonjour,

    Avec un try et except ValueError... ça devrait faire l'affaire non ?

    Etienne
    Ben non, en fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> plop='fg'
    >>> try:
    	int(plop)
    except ValueError as err:
    	print(err.args)
     
     
    ("invalid literal for int() with base 10: 'fg'",)
    Il me renvoie le message complet et je ne vois pas comment séparer proprement le message d'erreur et la valeur de la variable en paramètre.
    l'idée, c'est de vérifier si la variable plop ne contient que des espaces, alors je renvoie zéro, sinon, je balance une erreur pour retrouver ce qui a fait planter la bête.

    @+

  5. #5
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 060
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 060
    Par défaut
    Il me renvoie le message complet et je ne vois pas comment séparer proprement le message d'erreur et la valeur de la variable en paramètre.
    l'idée, c'est de vérifier si la variable plop ne contient que des espaces, alors je renvoie zéro, sinon, je balance une erreur pour retrouver ce qui a fait planter la bête.
    Veuillez donner un exemple d'entrée sortie, votre histoire n'est pas claire.

    En entrée vous avez une chaîne de caractères, et en sortie vous voulez exactement quoi?

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2012
    Messages : 39
    Par défaut
    Bonjour,

    Pour récupérer la chaîne très simplement, il suffit d'écrire le bloc comme fred1599 l'a indiqué :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    plop='fg'
    try:
    	int(plop)
    except ValueError:
    	print(plop)
     
            [suite du code éventuellement pour identifier facilement l'erreur]

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

    Informations forums :
    Inscription : Novembre 2007
    Messages : 39
    Par défaut
    Bonjour,
    la fonction de départ est celle ci, elle marchait nickel en 2.7, mais depuis le passage à 3.3, ça foire. Cette fonction est utilisée en décorateur.

    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
    def typage():
        def  wrapper(fonction):
            def wrapped(arg,*args,**kwargs):
                foo = fonction(arg,*args,**kwargs)
                if 'type' in kwargs:
                    tmp = kwargs['type']
                    try:
                        foo = tmp(foo)
                    except ValueError as detail:
                        if detail.args[0] == "invalid literal for int() with base 10: ''":
                            foo = 0
                        else:
                            raise detail
                return foo
            return wrapped
        return wrapper
    L'idée est la suivante, je parse des lignes dont certaines valeurs doivent être des entiers, sauf que le format est batard, que les valeur nulles ne sont pas représenté par _des_ 0, mais par _des_ blancs (le _des_ est variable, de 1 à n caractères)

    Ce que je souhaite, c'est qu'il me transforme les "45" en 45, les " " en 0 et que toute autre valeur lève une erreur.

    d’où l'exemple minimum suivant (echoue 3.3, et marche en 2.7):
    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
    >>> def to_int(entree):
    	try:
    		foo= int(entree)
    	except ValueError as err:
    		if err.args[0] == "invalid literal for int() with base 10: ''":
    			foo = 0
    		else:
    			raise err
    	return foo
     
    >>> to_int('45')
    45
    >>> to_int(' ')
    Traceback (most recent call last):
      File "<pyshell#108>", line 1, in <module>
        to_int(' ')
      File "<pyshell#106>", line 8, in to_int
        raise err
      File "<pyshell#106>", line 3, in to_int
        foo= int(entree)
    ValueError: invalid literal for int() with base 10: ' '
    >>> to_int('ab')
    Traceback (most recent call last):
      File "<pyshell#109>", line 1, in <module>
        to_int('ab')
      File "<pyshell#106>", line 8, in to_int
        raise err
      File "<pyshell#106>", line 3, in to_int
        foo= int(entree)
    ValueError: invalid literal for int() with base 10: 'ab'

    Le problème vient qu'en python 2.7: on obtient cette erreur:
    >>> int(' ')
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    ValueError: invalid literal for int() with base 10: ''

    et qu'en 33, (plus pointilleux), on a :
    >>> int(' ')
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    ValueError: invalid literal for int() with base 10: ' '

    @+

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 39
    Par défaut
    J'ai résolu le problème en modifiant la fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def to_int(entree):
    	try:
    		foo= int(entree)
    	except ValueError as err:
    		if entree.isspace():
    			foo = 0
    		else:
    			raise err
    	return foo
    Merci de votre aide

    @+

  9. #9
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 715
    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 715
    Par défaut
    Salut,
    Se baser sur le format d'une chaîne de caractères pour traiter une erreur résiste toujours assez mal aux mises à jour.

    Juste pour vous proposer un code plus simple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def to_int(s):
            if s.isspace(): 
                 return 0
            return int(s)
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 39
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,
    Se baser sur le format d'une chaîne de caractères pour traiter une erreur résiste toujours assez mal aux mises à jour.
    Hélas, je l'apprends à mes dépends

    Juste pour vous proposer un code plus simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def to_int(s):
            if s.isspace(): 
                 return 0
            return int(s)
    - W
    C'était l'idée de mon code de départ, mais je suis parti du principe que j'avais plus souvent des chaines numérique, que des blancs, alors le try m'a semblé mieux.

    Je trouve, peu être a tort, que le if pour traiter des erreurs potentielles n'est pas des plus adapté.

    Cordialement

  11. #11
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 060
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 060
    Par défaut
    Mais vous utilisez un if dans un try except...

    Faites confiance aux expérimentés

    On pourrait le faire en une ligne, c'est tout aussi lisible.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def to_int(s):
        return 0 if s.isspace() else int(s)

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 39
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Faites confiance aux expérimentés
    C'est pour ça que j'ai posté ici

    @+

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

Discussions similaires

  1. Récupération valeur d'une propriété type TStrings
    Par Stéphane Vaillant dans le forum Langage
    Réponses: 2
    Dernier message: 01/03/2003, 11h47
  2. [XMLRAD] récupération de donnée
    Par Mitch79 dans le forum XMLRAD
    Réponses: 7
    Dernier message: 30/01/2003, 15h36
  3. Réponses: 5
    Dernier message: 09/01/2003, 11h55
  4. récupération d'images
    Par MANU_2 dans le forum Composants VCL
    Réponses: 3
    Dernier message: 05/08/2002, 18h36
  5. Réponses: 4
    Dernier message: 05/06/2002, 12h15

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