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

Le
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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Méta-MCI \(MVP\)
Le #16472231
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
Pierre Maurette
Le #16472771
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
Méta-MCI \(MVP\)
Le #16478591
Re !

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

Ça pourrait t'intéresser.

@+

Michel Claveau
Publicité
Poster une réponse
Anonyme