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 !'
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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
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
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
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.
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
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
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
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
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.
<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.
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.
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
<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
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
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
<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.
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
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
<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.
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
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 -
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...
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...