PHWinfo banniere

Titres
PORTAIL ANNUAIRE ARTICLES COMPARATEUR HÉBERGEURS DEVIS FORUMS RÉDUCTEUR D'URL
Précédent   PHWinfo > Autres forums > Forum Programmation & Conception > fr.comp.lang.python > Ordre d'évaluation des paramètres d'une fonction
S'inscrire FAQ Membres Recherche Messages du jour Marquer les forums comme lus
Ordre d'évaluation des paramètres d'une fonction

Réponse
 
LinkBack Outils de la discussion
Vieux 25/10/2007, 06h55   #1
Pierre Maurette
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Ordre d'évaluation des paramètres d'une fonction

Bonjour,

Pas moyen de trouver une réponse claire avec Google. Je voudrais savoir
ce qui est garanti concernant l'ordre d'évaluation des paramètres lors
d'un appel de fonction. Mes tests (voir code) ne sont pas en
contradiction avec une évaluation de gauche à droite, mais puis-je en
être certain ? Pour #test1 et #test2, ou uniquement pour #test2 ? Si
oui, sources ?

Code de test (#test3 et le try...except sont pour vérifier d'autres
trucs):

liste = [3, 'cc', 2, 'bbb', 1, 'a']

def foo(chaine, x=liste[5], y=liste[4]):
print "%s !! x est: '%s' et y vaut: %d" % (chaine, x, y)
try:
liste[3]
print 'Good !'
except IndexError:
print 'Bad !'

def test():
foo('Bonjour', liste.pop(), liste.pop()) #test1
foo('Hello', *(liste.pop(), liste.pop())) #test2
foo('Default') #test3

if __name__ == '__main__':
test()

Merci de vos lumières...

--
Pierre Maurette


  Réponse avec citation
Vieux 25/10/2007, 07h27   #2
William Dode
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Ordre d'évaluation desparamètres d'une fonction

On 25-10-2007, Pierre Maurette wrote:
> Bonjour,
>
> Pas moyen de trouver une réponse claire avec Google. Je voudrais savoir
> ce qui est garanti concernant l'ordre d'évaluation des paramètres lors
> d'un appel de fonction. Mes tests (voir code) ne sont pas en
> contradiction avec une évaluation de gauche à droite, mais puis-je en
> être certain ? Pour #test1 et #test2, ou uniquement pour #test2 ? Si
> oui, sources ?


Sources je sais plus, mais oui, c'est certain...
Tu peux faire sans crainte

if 'a' in mydic and mydic['a']

Je le fais tout le temps pour ne pas oublier qu'un jour j'ai vérifié que
c'était certain !

--
William Dodé - http://flibuste.net
Informaticien indépendant
  Réponse avec citation
Vieux 25/10/2007, 12h15   #3
Pierre Maurette
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Ordre d'évaluation des paramètres d'une fonction

William Dode, le 25/10/2007 a écrit :
> On 25-10-2007, Pierre Maurette wrote:
>> Bonjour,
>>
>> Pas moyen de trouver une réponse claire avec Google. Je voudrais savoir
>> ce qui est garanti concernant l'ordre d'évaluation des paramètres lors
>> d'un appel de fonction. Mes tests (voir code) ne sont pas en
>> contradiction avec une évaluation de gauche à droite, mais puis-je en
>> être certain ? Pour #test1 et #test2, ou uniquement pour #test2 ? Si
>> oui, sources ?

>
> Sources je sais plus, mais oui, c'est certain...
> Tu peux faire sans crainte
>
> if 'a' in mydic and mydic['a']
>
> Je le fais tout le temps pour ne pas oublier qu'un jour j'ai vérifié que
> c'était certain !


Je vous remercie. Mais j'ai encore un doute. L'exemple que vous donnez,
c'est l'évaluation économique (ou paresseuse) des expressions
booléennes, et c'est effectivement documenté. Et largement utilisé...
En C, cette évaluation paresseuse est garantie: "Unlike the bitwise
binary & operator, the && operator guarantees left-to-right evaluation;
there is a sequence point after the evaluation of the first operand. If
the first operand compares equal to 0, the second operand is not
evaluated.", et l'équivalent pour l'opérateur OU ||.
Mais l'ordre d'évaluation des paramètres de fonctions ne l'est
expressément pas: "The order of evaluation of the function designator,
the actual arguments, and subexpressions within the actual arguments is
unspecified, but there is a sequence point before the actual call."

Donc pour prendre un autre exemple:

a = 1
b = 2

def foobis(x, y):
print "x = %d, y = %d" % (x, y)

def fooa():
global a, b
a = 10
return b

def foob():
global a
return a

def test():
foobis(fooa(), foob())

La sortie:
x = 2, y = 10
me montre que tout se passe selon un ordre "logique":
- appel de fooa(), avec effet de bord sur a.
- affectation de la valeur de retour au paramètre x.
- appel de foob().
- affectation de la valeur de retour au paramètre y.

La question que je me pose, c'est donc bien si ce séquencement est,
contrairement au C, garanti.

--
Pierre Maurette


  Réponse avec citation
Vieux 25/10/2007, 12h38   #4
William Dode
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Ordre d'évaluation desparamètres d'une fonction

On 25-10-2007, Pierre Maurette wrote:
> William Dode, le 25/10/2007 a écrit :
>> On 25-10-2007, Pierre Maurette wrote:
>>> Bonjour,
>>>
>>> Pas moyen de trouver une réponse claire avec Google. Je voudrais savoir
>>> ce qui est garanti concernant l'ordre d'évaluation des paramètres lors


désolé, j'avais lu que les 2 premières lignes !


>>> d'un appel de fonction.


--
William Dodé - http://flibuste.net
Informaticien indépendant
  Réponse avec citation
Vieux 25/10/2007, 12h46   #5
Laurent Pointal
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Ordre d'évaluation des paramètres d'une fonction

Pierre Maurette a écrit :
<zip>
> La question que je me pose, c'est donc bien si ce séquencement est,
> contrairement au C, garanti.


Pour la garantie, il faudrais peut-être poser la question au moins sur
comp.lang.python - histoire de toucher les développeurs principaux de
Python [je ne crois pas qu'il y en ait sur fclp] - ou sur la liste de
développement Python si clp ne donne pas de résultat...

Note: tu peux utiliser le module de désassemblage dis pour voir le code
machine Python... mais ça ne donnera pas d'information sur la garantie
que l'évaluation se fait toujours dans cet ordre.

A+

Laurent.
  Réponse avec citation
Vieux 25/10/2007, 20h13   #6
Amaury Forgeot d'Arc
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Ordre d'évaluation des paramètres d'une fonction

Laurent Pointal a écrit :
> Pierre Maurette a écrit :
> <zip>
>> La question que je me pose, c'est donc bien si ce séquencement est,
>> contrairement au C, garanti.

>
> Pour la garantie, il faudrais peut-être poser la question au moins sur
> comp.lang.python - histoire de toucher les développeurs principaux de
> Python [je ne crois pas qu'il y en ait sur fclp] - ou sur la liste de
> développement Python si clp ne donne pas de résultat...


La doc me semble pourtant assez claire:
http://docs.python.org/dev/reference...aluation-order

Tout est dans l'ordre des choses!

--
Amaury

  Réponse avec citation
Vieux 26/10/2007, 05h32   #7
Pierre Maurette
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Ordre d'évaluation des paramètres d'une fonction

Amaury Forgeot d'Arc, le 25/10/2007 a écrit :
> Laurent Pointal a écrit :
>> Pierre Maurette a écrit :
>> <zip>
>>> La question que je me pose, c'est donc bien si ce séquencement est,
>>> contrairement au C, garanti.

>>
>> Pour la garantie, il faudrais peut-être poser la question au moins sur
>> comp.lang.python - histoire de toucher les développeurs principaux de
>> Python [je ne crois pas qu'il y en ait sur fclp] - ou sur la liste de
>> développement Python si clp ne donne pas de résultat...

>
> La doc me semble pourtant assez claire:
> http://docs.python.org/dev/reference...aluation-order
>
> Tout est dans l'ordre des choses!


Merci. Youpi ! Effectivement, c'était dans mes trois "Language
Reference", en 5.13.
En fait, mes recherches avaient échoué certainement parce que, à moins
d'avoir comme c'est mon cas l'esprit un peu tordu et pollué par le C,
la réponse était évidente, donc le sujet pas traité. "evaluation order"
m'amenait au mieux vers les précédences d'opérateurs, "left to right"
vers un peu tout, "side effect" vers des bugs, d'autres langages ou des
articles sur la programmation fonctionelle.

--
Pierre Maurette


  Réponse avec citation
Vieux 26/10/2007, 05h54   #8
Pierre Maurette
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Ordre d'évaluation des paramètres d'une fonction

Laurent Pointal, le 25/10/2007 a écrit :
> Pierre Maurette a écrit :
> <zip>
>> La question que je me pose, c'est donc bien si ce séquencement est,
>> contrairement au C, garanti.

>
> Pour la garantie, il faudrais peut-être poser la question au moins sur
> comp.lang.python - histoire de toucher les développeurs principaux de Python
> [je ne crois pas qu'il y en ait sur fclp] - ou sur la liste de développement
> Python si clp ne donne pas de résultat...


Il vaut mieux que j'évite de poster en anglais. Je le lis à peu près,
encore que pour les nuances (je comprends tous les mots, mais le sens à
l'envers), mais c'est une horreur pour écrire.
Avant d'obtenir d'Amaury la réponse (elle est en 5.13 du Language
Reference), j'en étais arrivé à la conclusion que je sodomisais
inutilement le diptère. Tous les signes montraient que je me posais des
questions dont la réponse était tellement évidente pour un vrai
programmeur Python que les sources Google étaient quasi inexistantes.
En particulier s'il y avait eu possiblité d'effets indésirables,
j'aurais obtenu des dizaines de réponses Google pertinentes avec:
python function parameters OR arguments "side effect"
Il n'en est rien.



> Note: tu peux utiliser le module de désassemblage dis pour voir le code
> machine Python... mais ça ne donnera pas d'information sur la garantie que
> l'évaluation se fait toujours dans cet ordre.


Merci. Donc, j'ai testé dis. Des tests un peu vicieux me suffisaient à
constater que le comportement sur mes machines était toujours conforme
à la règle la plus logique. Mais avec dis, c'est encore plus clair.

--
Pierre Maurette


  Réponse avec citation
Réponse


Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are oui
Pingbacks are oui
Refbacks are oui


Fuseau horaire GMT +1. Il est actuellement 23h50.


Édité par : vBulletin® version 3.7.2
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.2.0 RC5 Tous droits réservés.
Version française #16 par l'association vBulletin francophone
PHWinfo est un site Éducation Sans Frontières
Ad Management by RedTyger
©Tous droits réservés par les parties respectives
Page generated in 0,15533 seconds with 16 queries