OVH Cloud OVH Cloud

fonction None ?

20 réponses
Avatar
Méta-MCI \(MVP\)
Bonsoir !

Pour limiter les instructions, lors d'une utilisation massive de
callbacks, je cherche une fonction "None".

Certes, je pourrais faire un truc du genre :
def void(*param):
pass
Mais cela cela entraînerait la création d'un espace de noms, des
affectations de noms aux paramètres, etc.

J'aurais aimé une pseudo fonction qui évite même l'appel.

Si quelqu'un a une idée...

@+

Michel Claveau

10 réponses

1 2
Avatar
Cémoi
Bonsoir !

Pour limiter les instructions, lors d'une utilisation massive de
callbacks, je cherche une fonction "None".

Certes, je pourrais faire un truc du genre : def void(*param): pass
Mais cela cela entraînerait la création d'un espace de noms, des
affectations de noms aux paramètres, etc.

J'aurais aimé une pseudo fonction qui évite même l'appel.

Si quelqu'un a une idée...


Est ce que la méthode de classe spéciale __call__ a les même "effets de
bord" que définir une fonction avec def ?
J'imagine que c'est le cas ...

class Void:
def __call__(self, *args):
pass
none = Void()
print none("pas de troll aujourd'hui")
None



print reduce(none, range(10))
None




@+

Laurent


@+

Michel Claveau










Avatar
NicolasP
Certes, pour l'instant, j'utilise un
if callback: callback(..., ...., ....

Mais, une instruction gagnée, c'est une instruction gagnée ! (merci,
monsieur de Lapalisse).



Si le test n'est pas dans ton code, c'est l'interpréteur qui le fera. Il faut bien qu'il soit quelquepart ce test.
Même si l'interpréteur peut le faire en interne plus efficacement, est-ce que la différence sera sensible ?

Nicolas

Avatar
Bruno Desthuilliers
Bonsoir !

quand j'y pense, y aurait éventuellement matière à un PEP.


OK, mais un PEP, c'est en anglais...
Alors, si tu te sens, vas-y (ou, plutôt, Go! )
Mais perso, c'est largement au-delà de mes capacités
épistolaires-zé-linguistiques.


C'est toi qui est demandeur, c'est toi qui rédige !-)

Après, je veux bien traduire...


Avatar
Bruno Desthuilliers
Bonsoir !

Pour limiter les instructions, lors d'une utilisation massive de
callbacks, je cherche une fonction "None".

Certes, je pourrais faire un truc du genre : def void(*param): pass
Mais cela cela entraînerait la création d'un espace de noms, des
affectations de noms aux paramètres, etc.

J'aurais aimé une pseudo fonction qui évite même l'appel.

Si quelqu'un a une idée...


Est ce que la méthode de classe spéciale __call__ a les même "effets de
bord" que définir une fonction avec def ?


Je ne suis pas sûr de ce que tu veux dire par "effet de bord", mais pour
info, une fonction est une instance de la classe "function", laquelle
implémente la méthode __call__.

def toto(): print "toto"
...



toto.__call__
<method-wrapper '__call__' of function object at 0xb78e20d4>



toto.__call__()
toto










Avatar
Bruno Desthuilliers
'soir !

Avec lambda ?


Là, j'ai des doutes sur l'efficacité de lambda.


lambda crée un objet function tout à fait ordinaire.


Avatar
Laurent Pointal
Le Tue, 25 Mar 2008 14:49:33 +0100, Bruno Desthuilliers a écrit :

'soir !

Avec lambda ?


Là, j'ai des doutes sur l'efficacité de lambda.


lambda crée un objet function tout à fait ordinaire.


Et... anonyme.

Par contre, pour le nombre variable d'arguments, je ne sais pas si ça le fait.




--
Laurent POINTAL -



Avatar
Laurent Pointal
Le Tue, 25 Mar 2008 17:23:12 +0000, Laurent Pointal a écrit :

Le Tue, 25 Mar 2008 14:49:33 +0100, Bruno Desthuilliers a écrit :

'soir !

Avec lambda ?


Là, j'ai des doutes sur l'efficacité de lambda.


lambda crée un objet function tout à fait ordinaire.


Et... anonyme.

Par contre, pour le nombre variable d'arguments, je ne sais pas si ça le
fait.



Ben si:
f = lambda *x: sum(x)
f(1,3,4)
8




Et avec les arguments nommés aussi:
g = lambda *x,**y: 0

g(213342,toto=4)
0






--
Laurent POINTAL -




Avatar
Laurent Pointal
Le Tue, 25 Mar 2008 17:35:09 +0000, Laurent Pointal a écrit :

<zip>

Ceci dit, utiliser ça de façon intensive, ça crée de multiples
exemplaires d'une fonction anonyme qui ne fait rien (mais qui occupe
quand même sa définition)... pas sûr que ça soit plus efficace que la
définition d'une NoneFct et son utilisation partout où en a en besoin.

Est-ce que Michel est à 1 (un) nom prêt ?

--
Laurent POINTAL -
Avatar
Laurent Pointal
Le Tue, 25 Mar 2008 22:06:49 +0100, Méta-MCI (MVP) a écrit :

Bonsoir !

nom prêt ?


Pas d' a priori ; mais, c'est pas les idées qui manquent :
None() none() void() null() nf() (Non Fonction) chirac() (qq
chose que ne fait (plus) rien) zero() blank() vacuum() nothing()
java() (qq chose qui vaut 'null')


Perso, j'aime bien NoneFct().





--
Laurent POINTAL -


Avatar
Laurent Pointal
Le Wed, 26 Mar 2008 11:07:13 +0100, Bruno Desthuilliers a écrit :

A y re-réfléchir, et bien que l'idée reste intéressante, il y a aussi un
truc qui me dérange un peu dans l'idée, c'est le fait d'avoir la
sémantique d'un appel mais pas d'appel. Ca rompt l'uniformité, et ça
contredit le "special cases are not special enough to break the rules".


Heu, il y a la sémantique d'un appel, et il y a un appel effectif, sauf
que le code ne fait rien ou presque. Mais un appel qui ne fait rien
multiplié par beaucoup, ça peut devenir onéreux.
Peut-être que parfois un simple
if fct is not None : fct(xxx)
est plus efficace et sémantiquement clair

Bon, si tu veux pouvoir trimbaler la fonction à droite ou à gauche et la
passer à d'autres morceaux de code qui ne savent pas qu'elle peut être à
None, en effet il vaut mieux supporter la sémantique de l'appel.

A+

Laurent.







--
Laurent POINTAL -

1 2