|
|
|
|
||||||
![]() |
|
|
LinkBack | Outils de la discussion |
|
|
#1 |
|
Messages: n/a
Hébergeur: |
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 |
|
|
|
#2 |
|
Messages: n/a
Hébergeur: |
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 |
|
|
|
#3 |
|
Messages: n/a
Hébergeur: |
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 |
|
|
|
#4 |
|
Messages: n/a
Hébergeur: |
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 |
|
|
|
#5 |
|
Messages: n/a
Hébergeur: |
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 |
|
|
|
#6 |
|
Messages: n/a
Hébergeur: |
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 |
|
|
|
#7 |
|
Messages: n/a
Hébergeur: |
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 |
|
|
|
#8 |
|
Messages: n/a
Hébergeur: |
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. |
|
|
|
#9 |
|
Messages: n/a
Hébergeur: |
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. |
|
|
|
#10 |
|
Messages: n/a
Hébergeur: |
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 |
|
|
|
#11 |
|
Messages: n/a
Hébergeur: |
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 |
|
|
|
#12 |
|
Messages: n/a
Hébergeur: |
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 |
|
|
|
#13 |
|
Messages: n/a
Hébergeur: |
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 |
|
|
|
#14 |
|
Messages: n/a
Hébergeur: |
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 |
|
|
|
#15 |
|
Messages: n/a
Hébergeur: |
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 |
|
|
|
#16 |
|
Messages: n/a
Hébergeur: |
Le Thu, 25 Oct 2007 21:13:32 +0200, Amaury Forgeot d'Arc 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! 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 - laurent.pointal@laposte.net |
|
|
|
#17 |
|
Messages: n/a
Hébergeur: |
Le Thu, 25 Oct 2007 21:13:32 +0200, Amaury Forgeot d'Arc 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! 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 - laurent.pointal@laposte.net |
|
|
|
#18 |
|
Messages: n/a
Hébergeur: |
Laurent Pointal a écrit :
> Le Thu, 25 Oct 2007 21:13:32 +0200, Amaury Forgeot d'Arc 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! > > 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 > Ben, j'ai choisi la doc en cours de développement parce qu'elle est beaucoup plus jolie, et plus facile à lire et à utiliser. Et de toutes façons, python 2.6 ne sera pas si différent des autres, surtout sur ce genre de sujets. -- Amaury |
|
|
|
#19 |
|
Messages: n/a
Hébergeur: |
Laurent Pointal a écrit :
> Le Thu, 25 Oct 2007 21:13:32 +0200, Amaury Forgeot d'Arc 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! > > 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 > Ben, j'ai choisi la doc en cours de développement parce qu'elle est beaucoup plus jolie, et plus facile à lire et à utiliser. Et de toutes façons, python 2.6 ne sera pas si différent des autres, surtout sur ce genre de sujets. -- Amaury |
|
![]() |
| Outils de la discussion | |
|
|