Envoyer globalement les arguments d'une fonction vers une autre fonction
3 réponses
Pierre Maurette
Bonsoir,
Dans mon petit souci, je suis arrivé un peu par tâtonnements à:
<CODE>
def f1(a, b, **_):
return a + b
def f0(a, b, c=0):
return c *(f1(**locals()))
print f0(10, 23, 2)
</CODE>
Ce n'est pas de la curiosité, c'est pour alléger du code
significativement. Dans ce cas réel, f1 est une acquisition de liste,
plus ou moins unique. En revanche il y a plusieurs fonctions de
traitement de type f0. La liste d'arguments passée à f1 est assez
charnue. Je pense que le problème est assez courant.
Je vais donc utiliser cette solution, à moins que vous m'en donniez une
autre plus standard et qui éviterait la verrue du **_.
Il est clair que f1 ne peut pas être interne à f0, et c'est un peu tard
pour passer en oo, je le regrette et j'y penserai à l'avenir.
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
Méta-MCI \(MVP\)
Bonjour !
Je n'ai pas de solution, mais je vois un problème avec **locals(). En effet, locals() est un dictionnaire. Or, un dictionnaire n'est pas ordonné. Ou, plutôt, l'ordre de création des items n'est pas conservé. Cela signifie que les paramètres passés à f1() ne seront pas toujours dans le même ordre. S'il n'y a que des paramètres nommés, ça ira. Mais, avec les paramètres par position, j'ai un doute.
Sinon, il y aurait peut-être une solution avec les décorateurs (je n'ai pas le temps d'essayer, ce matin).
Si tu trouves un super truc, ça m'intéresse aussi.
@-salutations
Michel Claveau
Bonjour !
Je n'ai pas de solution, mais je vois un problème avec **locals().
En effet, locals() est un dictionnaire. Or, un dictionnaire n'est pas
ordonné. Ou, plutôt, l'ordre de création des items n'est pas conservé.
Cela signifie que les paramètres passés à f1() ne seront pas toujours
dans le même ordre. S'il n'y a que des paramètres nommés, ça ira. Mais,
avec les paramètres par position, j'ai un doute.
Sinon, il y aurait peut-être une solution avec les décorateurs (je n'ai
pas le temps d'essayer, ce matin).
Si tu trouves un super truc, ça m'intéresse aussi.
Je n'ai pas de solution, mais je vois un problème avec **locals(). En effet, locals() est un dictionnaire. Or, un dictionnaire n'est pas ordonné. Ou, plutôt, l'ordre de création des items n'est pas conservé. Cela signifie que les paramètres passés à f1() ne seront pas toujours dans le même ordre. S'il n'y a que des paramètres nommés, ça ira. Mais, avec les paramètres par position, j'ai un doute.
Sinon, il y aurait peut-être une solution avec les décorateurs (je n'ai pas le temps d'essayer, ce matin).
Si tu trouves un super truc, ça m'intéresse aussi.
@-salutations
Michel Claveau
Pierre Maurette
Méta-MCI (MVP), le 04/08/2008 a écrit :
Bonjour !
Je n'ai pas de solution, mais je vois un problème avec **locals(). En effet, locals() est un dictionnaire. Or, un dictionnaire n'est pas ordonné. Ou, plutôt, l'ordre de création des items n'est pas conservé. Cela signifie que les paramètres passés à f1() ne seront pas toujours dans le même ordre. S'il n'y a que des paramètres nommés, ça ira. Mais, avec les paramètres par position, j'ai un doute.
Il est clair que locals() est un dictionnaire et donc que **locals() représente des variables nommées et en suit donc les règles. A partir de là le comportement est celui que j'attendais. En particulier les situations qui pourraient entraîner le masquage d'une étourderie génèrent une exeption. J'ai refait mon bout de test. Le premier était commutatif sur a et b, ce qui était un peu ballot quand même.
<CODE>
#def f1(a, b, **_): # return c + a - b #NameError: global name 'c' is not defined
def f1(a, b, **_): c = 100 return c + a - b
def f2(a, b, c, d, **_): print a, b, c, d
def f0(a, b, c=0): print locals() return c *(f1(**locals()))
a = b = c = d = 111 #f2(10, 20, d0, **locals()) #TypeError: f2() got multiple values for keyword argument 'd' #f2(10, 20, **locals()) #TypeError: f2() got multiple values for keyword argument 'a' f2(**locals())
</CODE>
Sinon, j'utilise le plus souvent des paramètres nommés, à l'exception classique du premier quand il s'agit de "l'objet principal".
Sinon, il y aurait peut-être une solution avec les décorateurs (je n'ai pas le temps d'essayer, ce matin).
Je ne connais pas les décorateurs, faudra que je vois ça un de ces jours...
Bonne journée,
-- Pierre Maurette
Méta-MCI (MVP), le 04/08/2008 a écrit :
Bonjour !
Je n'ai pas de solution, mais je vois un problème avec **locals().
En effet, locals() est un dictionnaire. Or, un dictionnaire n'est pas
ordonné. Ou, plutôt, l'ordre de création des items n'est pas conservé.
Cela signifie que les paramètres passés à f1() ne seront pas toujours dans le
même ordre. S'il n'y a que des paramètres nommés, ça ira. Mais, avec les
paramètres par position, j'ai un doute.
Il est clair que locals() est un dictionnaire et donc que **locals()
représente des variables nommées et en suit donc les règles. A partir
de là le comportement est celui que j'attendais. En particulier les
situations qui pourraient entraîner le masquage d'une étourderie
génèrent une exeption.
J'ai refait mon bout de test. Le premier était commutatif sur a et b,
ce qui était un peu ballot quand même.
<CODE>
#def f1(a, b, **_):
# return c + a - b #NameError: global name 'c' is not defined
def f1(a, b, **_):
c = 100
return c + a - b
def f2(a, b, c, d, **_):
print a, b, c, d
def f0(a, b, c=0):
print locals()
return c *(f1(**locals()))
Je n'ai pas de solution, mais je vois un problème avec **locals(). En effet, locals() est un dictionnaire. Or, un dictionnaire n'est pas ordonné. Ou, plutôt, l'ordre de création des items n'est pas conservé. Cela signifie que les paramètres passés à f1() ne seront pas toujours dans le même ordre. S'il n'y a que des paramètres nommés, ça ira. Mais, avec les paramètres par position, j'ai un doute.
Il est clair que locals() est un dictionnaire et donc que **locals() représente des variables nommées et en suit donc les règles. A partir de là le comportement est celui que j'attendais. En particulier les situations qui pourraient entraîner le masquage d'une étourderie génèrent une exeption. J'ai refait mon bout de test. Le premier était commutatif sur a et b, ce qui était un peu ballot quand même.
<CODE>
#def f1(a, b, **_): # return c + a - b #NameError: global name 'c' is not defined
def f1(a, b, **_): c = 100 return c + a - b
def f2(a, b, c, d, **_): print a, b, c, d
def f0(a, b, c=0): print locals() return c *(f1(**locals()))