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
|