Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Problème avec la fonction eval

3 réponses
Avatar
Thomas Paviot
Bonjour à tous,

J'ai écrit, via la bibliothèque wxPython, une petite calculatrice.
L'utilisateur rentre sa formule dans un champ et le programme calcule
alors le résultat et l'affiche dans le même champ.

Je récupère la relation de l'utilisateur sous forme d'une chaîne de
caractères et j'utilise ensuite la fonction eval pour calculer le résultat.

Cette technique me pose un soucis dans le cas suivant : supposons que
l'utilisateur saisisse '1/2':

>>> eval('1/2')
0
>>>

Ce résultat, tout-à-fait normal, est tout de même très surprenant pour
l'utilisateur qui s'attendait au résultat 0.5. Il aurait fallu entrer:
>>> eval('1./2')
0.5
>>>

Le fait de demander à l'utilisateur de saisir les entiers avec un point
n'est pas pratique et peut être source d'erreurs s'il ne le fait pas. Je
souhaite donc automatiser la vérification de la relation saisie par
l'utilisateur.

La question que je vous pose est donc la suivante : comment pourrais-je
faire pour que, avant d'utiliser 'eval', tous les entiers contenus dans
la chaîne de caractères soient convertis en réel (en ajoutant un '.')?

ex: chaîne saisie : 'sin(34/56)+122/3'
chaîne corrigée : 'sin(34./56.)+122./3.'

Cordialement,

Thomas Paviot

3 réponses

Avatar
yves
On Wed, 08 Nov 2006 07:32:53 +0100, Thomas Paviot
wrote:

Bonjour

eval('1/2')
0





from __future__ import division

ne marche pas dans ton programme ?

Ici:
|>>> print eval('1/2')
0
|>>> from __future__ import division
|>>> print eval('1/2')
0.5

--
Yves




Avatar
Thomas Paviot
On Wed, 08 Nov 2006 07:32:53 +0100, Thomas Paviot
wrote:

Bonjour

eval('1/2')
0





from __future__ import division

ne marche pas dans ton programme ?

Ici:
|>>> print eval('1/2')
0
|>>> from __future__ import division
|>>> print eval('1/2')
0.5

Si, ça marche, mais je ne connaissais pas du tout ce module.


Merci beaucoup.

Thomas Paviot





Avatar
yves
On Wed, 08 Nov 2006 10:23:02 +0100, Thomas Paviot
wrote:

Si, ça marche, mais je ne connaissais pas du tout ce module.


Attention, par contre, si dans ton code tu utilises quelque part
vraiment la division entière, il faut utiliser dans ce cas //

|>>> from __future__ import division
|>>> print eval('1//2')
0



En fait, je pense qu'il est prudent de toujours utiliser:
from __future__ import division

--
Yves