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

passage de fonction en paramêtre

7 réponses
Avatar
jm
Bonsoir,

Je souhaite passer une fonction de string en param=EAtre (islower,
isupper, ...); je n'y arrive pas ...

d=E9ja essay=E9 :

param_func =3D str.islower

mais "string".param_func() donne l'erreur

AttributeError: 'str' object has no attribute 'param_func'

Id=E9es ?

D'avance merci.

JM.

7 réponses

Avatar
Amaury Forgeot d'Arc
Bonsoir,

Je souhaite passer une fonction de string en paramêtre (islower,
isupper, ...); je n'y arrive pas ...

déja essayé :

param_func = str.islower

mais "string".param_func() donne l'erreur

AttributeError: 'str' object has no attribute 'param_func'

Idées ?


Facile (quand on sait ;-)) :

param_func = str.islower
param_func("string")
True




En python, une méthode est une fonction qui prend l'objet comme premier
paramètre. Certains considèrent que la notation "appel de méthode"
x.islower()
n'est qu'un raccourci pour
type(x).islower(x)

--
Amaury



Avatar
Bruno Desthuilliers
Bonsoir,

Je souhaite passer une fonction de string en paramêtre (islower,
isupper, ...); je n'y arrive pas ...

déja essayé :

param_func = str.islower

mais "string".param_func() donne l'erreur

AttributeError: 'str' object has no attribute 'param_func'

Idées ?


def test(func):
... return func("Allo Brest ? ")



...
test(str.lower)
'allo brest ? '



test(str.upper)
'ALLO BREST ? '



test(str.capitalize)
'Allo brest ? '



test(list)
['A', 'l', 'l', 'o', ' ', 'B', 'r', 'e', 's', 't', ' ', '?', ' ']




# etc...

D'une manière générale, la syntaxe obj.method() est un raccourci pour
Class.method(obj).



Avatar
Bruno Desthuilliers

Bonsoir,

Je souhaite passer une fonction de string en paramêtre (islower,
isupper, ...); je n'y arrive pas ...

déja essayé :

param_func = str.islower

mais "string".param_func() donne l'erreur

AttributeError: 'str' object has no attribute 'param_func'

Idées ?



Facile (quand on sait ;-)) :

param_func = str.islower
param_func("string")
True




En python, une méthode est une fonction qui prend l'objet comme premier
paramètre.


<pédant>
En Python, une méthode est un wrapper autour d'une fonction, lequel
wrapper appelle la fonction en lui passant l'objet comme premier
paramètre. <pedant-plus-plus>en fait, c'est même un peu plus compliqué
que ça </pedant-plus-plus>
</pédant>


Certains considèrent que la notation "appel de méthode"
x.islower()
n'est qu'un raccourci pour
type(x).islower(x)



Ce n'est pas une "considération", c'est effectivement ainsi que Python
fonctionne.

La class function implémente le protocole descripteur (le même qui sert
pour les properties). Lorsqu'une fonction est un attribut d'une classe,
le 'lookup' de cet attribut déclence l'appel du protocol descripteur de
la fonction (methode __get__(obj, type) de la fonction), lequel retourne
soit une bound method (si obj != None), soit une unbound method (si obj
== None) - dans les deux cas, une instance de la classe instancemethod
(la différence étant que dans le premier cas l'attribut im_self de
l'objet instancemethod est obj, dans le second il est None).

Cet objet instancemethod est un callable qui garde des références sur la
fonction (attribut im_func), l'objet (im_self) et la class (im_class),
et, lors de l'appel, soit injecte im_self comme premier paramètre (bond
method), soit vérifie que le premier paramètre passé est bien une
instance de im_class (unbound method). En bref, c'est un exemple
d'application partielle...

Les décorateurs classmethod et staticmethod modifient ce comportement,
le premier en faisant en sorte que im_func soit appelée avec im_class au
lieu de im_self, le second en n'injectant aucun paramètre supplémentaire
(en fait, la méthode __get__ de staticmethod se contente de retourner
im_func telle que...)

HTH




Avatar
jm
Bonsoir Amaury et Bruno,

Merci pour votre aide.

JM.


Bonsoir,

Je souhaite passer une fonction de string en paramêtre (islower,
isupper, ...); je n'y arrive pas ...

déja essayé :

param_func = str.islower

mais "string".param_func() donne l'erreur

AttributeError: 'str' object has no attribute 'param_func'

Idées ?



Facile (quand on sait ;-)) :

param_func = str.islower
param_func("string")
True




En python, une méthode est une fonction qui prend l'objet comme premi er
paramètre.


<pédant>
En Python, une méthode est un wrapper autour d'une fonction, lequel
wrapper appelle la fonction en lui passant l'objet comme premier
paramètre. <pedant-plus-plus>en fait, c'est même un peu plus compliqu é
que ça </pedant-plus-plus>
</pédant>


Certains considèrent que la notation "appel de méthode"
x.islower()
n'est qu'un raccourci pour
type(x).islower(x)



Ce n'est pas une "considération", c'est effectivement ainsi que Python
fonctionne.

La class function implémente le protocole descripteur (le même qui se rt
pour les properties). Lorsqu'une fonction est un attribut d'une classe,
le 'lookup' de cet attribut déclence l'appel du protocol descripteur de
la fonction (methode __get__(obj, type) de la fonction), lequel retourne
soit une bound method (si obj != None), soit une unbound method (si obj
== None) - dans les deux cas, une instance de la classe instancemethod
(la différence étant que dans le premier cas l'attribut im_self de
l'objet instancemethod est obj, dans le second il est None).

Cet objet instancemethod est un callable qui garde des références sur la
fonction (attribut im_func), l'objet (im_self) et la class (im_class),
et, lors de l'appel, soit injecte im_self comme premier paramètre (bond
method), soit vérifie que le premier paramètre passé est bien une
instance de im_class (unbound method). En bref, c'est un exemple
d'application partielle...

Les décorateurs classmethod et staticmethod modifient ce comportement,
le premier en faisant en sorte que im_func soit appelée avec im_class au
lieu de im_self, le second en n'injectant aucun paramètre supplémenta ire
(en fait, la méthode __get__ de staticmethod se contente de retourner
im_func telle que...)

HTH






Avatar
Amaury Forgeot d'Arc

Certains considèrent que la notation "appel de méthode"
x.islower()
n'est qu'un raccourci pour
type(x).islower(x)



Ce n'est pas une "considération", c'est effectivement ainsi que Python
fonctionne.

La class function implémente le protocole descripteur (le même qui sert
pour les properties). Lorsqu'une fonction est un attribut d'une classe,
le 'lookup' de cet attribut déclence l'appel du protocol descripteur de
la fonction (methode __get__(obj, type) de la fonction), lequel retourne
soit une bound method (si obj != None), soit une unbound method (si obj
== None) - dans les deux cas, une instance de la classe instancemethod
(la différence étant que dans le premier cas l'attribut im_self de
l'objet instancemethod est obj, dans le second il est None).

Cet objet instancemethod est un callable qui garde des références sur la
fonction (attribut im_func), l'objet (im_self) et la class (im_class),
et, lors de l'appel, soit injecte im_self comme premier paramètre (bond
method), soit vérifie que le premier paramètre passé est bien une
instance de im_class (unbound method). En bref, c'est un exemple
d'application partielle...

Les décorateurs classmethod et staticmethod modifient ce comportement,
le premier en faisant en sorte que im_func soit appelée avec im_class au
lieu de im_self, le second en n'injectant aucun paramètre supplémentaire
(en fait, la méthode __get__ de staticmethod se contente de retourner
im_func telle que...)



C'est malheureusement l'exacte description du fonctionnement de python.
Je dis "malheureusement", parce qu'il y a des choses qu'il vaut mieux
ignorer dans un premier temps...

--
Amaury


Avatar
Bruno Desthuilliers
Amaury Forgeot d'Arc wrote:

(snip détails sur le mécanismes fonctions/méthodes)



C'est malheureusement l'exacte description du fonctionnement de python.
Je dis "malheureusement", parce qu'il y a des choses qu'il vaut mieux
ignorer dans un premier temps...


Pourquoi donc ? Je veux dire : ce n'est effectivement peut-être pas la
première chose à expliquer à un programmeur débutant, mais par ailleurs
c'est aussi à ce genre de mécanismes - et au fait qu'on puisse prendre
la main dessus - que Python doit sa puissance. Ce serait dommage de
passer à côté, non ?

--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"


Avatar
Amaury Forgeot d'Arc
Amaury Forgeot d'Arc wrote:
(snip détails sur le mécanismes fonctions/méthodes)
C'est malheureusement l'exacte description du fonctionnement de python.
Je dis "malheureusement", parce qu'il y a des choses qu'il vaut mieux
ignorer dans un premier temps...


Pourquoi donc ? Je veux dire : ce n'est effectivement peut-être pas la
première chose à expliquer à un programmeur débutant, mais par ailleurs
c'est aussi à ce genre de mécanismes - et au fait qu'on puisse prendre
la main dessus - que Python doit sa puissance. Ce serait dommage de
passer à côté, non ?


Tu prêches un convaincu...

--
Amaury