OVH Cloud OVH Cloud

Encore un exemple (tordu/délirant/débile au choix)

7 réponses
Avatar
Méta-MCI
Bonsoir !

Comment compter combien de fois une fonction est appellée, sans décorator,
et sans variable globale ?

Une solution avec les méta-données (attributs de fonctions) :

def ff(this):
try:
this.count=this.count+1
except:
this.count=1
a=1
b=2
c=a+b

ff(ff)
fa=ff
ff(ff)
fa(fa)
print ff.count


Mais, ça doit pouvoir s'améliorer...

@+

MCI

7 réponses

Avatar
Bruno Desthuilliers
Bonsoir !

Comment compter combien de fois une fonction est appellée, sans décorator,
et sans variable globale ?


def countcall(self, _calls=[0]):
_calls[0] += 1
print "appel n° %d de countcall" % _calls[0]


Une solution avec les méta-données (attributs de fonctions) :

def ff(this):
try:
this.count=this.count+1
except:
this.count=1
a=1
b=2
c=a+b

ff(ff)
faÿ
ff(ff)
fa(fa)
print ff.count


Mais, ça doit pouvoir s'améliorer...


class CountFunc(object):
count = 0
def __call__(self):
self.__class__.count += 1

Avatar
Amaury Forgeot d'Arc
Bonsoir !

Comment compter combien de fois une fonction est appellée, sans
décorator, et sans variable globale ?


def countcall(self, _calls=[0]):
_calls[0] += 1
print "appel n° %d de countcall" % _calls[0]


J'allais proposer un truc semblable.
Et on peut même récupérer le compte depuis l'extérieur de la fonction:
countcall.func_defaults[-1][0]



Une solution avec les méta-données (attributs de fonctions) :

def ff(this):
try:
this.count=this.count+1
except:
this.count=1
a=1
b=2
c=a+b

ff(ff)
faÿ
ff(ff)
fa(fa)
print ff.count


Mais, ça doit pouvoir s'améliorer...


class CountFunc(object):
count = 0
def __call__(self):
self.__class__.count += 1



Avatar
jean-michel bain-cornu
Bonsoir,
Comment compter combien de fois une fonction est appellée, sans décorator,
et sans variable globale ?



Je préfère modestement le profiler :

import profile
profile.run('main()')

et on a un joli rapport avec entre autres, le nombre d'appels aux fonctions.

A+
jm

Avatar
Méta-MCI
Salut !

def countcall(self, _calls=[0]):
_calls[0] += 1
print "appel n° %d de countcall" % _calls[0]

J'allais proposer un truc semblable.
Et on peut même récupérer le compte depuis l'extérieur de la fonction:
countcall.func_defaults[-1][0]




Oui, c'est une idée. Mais, AMHA, c'est moins lisible, et plus tordu que de
passer par les attributs de fonction.
Pour mieux se rendre compte, voici deux versions :


def countcall(_calls=[0]):
_calls[0] += 1
print "appel n° %d de countcall" % _calls[0]
countcall()
print countcall.func_defaults[-1][0]



def countcall():
self=countcall
try:
self.count+=1
except:
self.count=1
print "appel n° %d de countcall" % self.count
countcall()
print countcall.count



Mais, on pourrait combiner les deux :

def countcall(_calls=[0]):
self=countcall
_calls[0]+=1
self.count=_calls[0]
print "appel n° %d de countcall" % self.count
countcall()
print countcall.count




@+
--
MCI


Avatar
Méta-MCI
Bonjour !

Dans le cas "particulier" du comptage d'appels, profiler est une exellente
idée. Merci de l'avoir remémoré.

Mais, l'exemple est plus général. Ainsi, en remplaçant le nb d'appels par un
cumul des paramètres (mais, dans ce cas, un générateur pourrait être encore
mieux).

@+

Michel Claveau
Avatar
Bruno Desthuilliers
Bonjour !

Dans le cas "particulier" du comptage d'appels, profiler est une exellente
idée. Merci de l'avoir remémoré.

Mais, l'exemple est plus général. Ainsi, en remplaçant le nb d'appels par un
cumul des paramètres (mais, dans ce cas, un générateur pourrait être encore
mieux).


Bin, en fait, il semble que pour les derniers exemples
"tordu/délirant/débile au choix" dont tu nous a gratifié, il existe déjà
des solutions bien plus simples et efficaces !-)

Mais continue quand même, c'est toujours intéressant d'explorer les
recoins d'un langage comme Python. (si, si, là je suis sérieux, juré).

Avatar
Michel Claveau
Salut !

c'est toujours intéressant d'explorer les recoins d'un langage comme Python.
(si, si, là je suis sérieux, juré).


Là, tu as bien compris ma démarche, qui n'est pas de proposer de
soi-disant solutions miracles, mais plutôt que montrer d'autres
chemins, et de provoquer des discussions ou débats.

ça sert aussi bien en tant que formation, que comme moyen de se
rappeler des trucs connus, mais un peu oubliés.


--
@-salutations

Michel Claveau