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

Envoyer globalement les arguments d'une fonction vers une autre fonction

3 réponses
Avatar
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.

Bonne soirée,

--
Pierre Maurette

3 réponses

Avatar
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
Avatar
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()))

print f0(10, 23, 2) # 174 (2 * (100 + 10 - 23))
print f1(10, 23) # 87 (100 + 10 - 23)
print f1(b, a#) # 113 (100 + 23 - 10)

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
Avatar
Méta-MCI \(MVP\)
Re !

Je suis tombé sur ça :
http://www.phyast.pitt.edu/~micheles/python/documentation.html
(dans "announce").

Ça pourrait t'intéresser.

@+

Michel Claveau