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

Ordre d'évaluation des paramètres d'une fonction

8 réponses
Avatar
Pierre Maurette
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

8 réponses

Avatar
William Dode
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

Avatar
Pierre Maurette
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


Avatar
William Dode
On 25-10-2007, Pierre Maurette wrote:
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



Avatar
Laurent Pointal
<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.

Avatar
Amaury Forgeot d'Arc
<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/expressions.html#evaluation-order

Tout est dans l'ordre des choses!

--
Amaury


Avatar
Pierre Maurette
<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/expressions.html#evaluation-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



Avatar
Pierre Maurette
<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


Avatar
Laurent Pointal
Le Thu, 25 Oct 2007 21:13:32 +0200, Amaury Forgeot d'Arc 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/expressions.html#evaluation-order

Tout est dans l'ordre des choses!


Dans la version de développement 2.6a...

Mais on le retrouve en effet aussi dans la doc de la version courante...

http://docs.python.org/ref/evalorder.html





--
Laurent POINTAL -