2014-02-12 174 views
14

所以我试图做一个函数,跟踪一个方法被调用的次数。 例如:有没有一种方法可以跟踪函数被调用的次数?

a = [1,2,3,4] 
a.pop() 

我想知道有多少次a.pop()是到目前为止在这个例子叫,我会得到1 有没有办法做到这一点?

+1

很容易用你自己的功能来完成,而不是那些内置的功能。 – roippi

+0

创建一个全局变量或通过引用 – wipindipy10

+0

在函数'pop'中传递,您可以定义一个名为'counter'的变量,然后在该函数的第一行执行'counter + = 1'。或类似的东西 – enginefree

回答

0

一个简单的方法是每次调用函数时增加一个全局变量。

counter = 0 

a = [1,2,3,4]  
a.pop() 
counter += 1 
+0

我相信OP想知道调用了多少次'a.pop()',那么你就不会那么做。你基本上是在计算你的代码在一个时间间隔内运行的次数。 – enginefree

+0

是的,我基本上是自己创建课堂,我需要计算一次调用方法的次数,但现在我已经明白了。感谢大家的帮助。 – user3050527

16

这并不适用于内置函数的工作,但一个有趣的方法是:

def myfunction(): 
    myfunction.counter += 1 
myfunction.counter = 0 

你给的功能属性,所以每次调用属性被更新。没有全局变量需要。

内置插件是只读的。他们不能被修改。

+0

谢谢。这节省了我的一天。 – lanenok

1
counter = 0 

def pop(): 
    counter += 1 
    print counter 
    #other function code 

a = [1,2,3,4] 
a.pop() 

这应该解决您的问题,你应该能够看到什么被计数。 + 每次调用函数时,计数器将随着函数的每次传递而增加和打印。

IF其内置的:

counter = 0 
    def newfunction(): 
     a = [1,2,3,4] 
     a.pop() 
     counter += 1 
     print counter 

在这个逻辑是,它会调用你的新功能进入功能被预制然后走出的内置函数,然后去纪念计数器增加。输出你的计数器。

+0

iirc你必须全局变量,然后才能在全局范围内修改它的函数 – icedtrees

+0

谢谢,我忘了补充一点。 :p – castaway2000

16

您可以使用一个装饰器来跟踪该函数被调用的次数。由于list是内置的,因此您不能修饰或替换其pop方法,因此您必须使用自己的列表类。

def counted(f): 
    def wrapped(*args, **kwargs): 
     wrapped.calls += 1 
     return f(*args, **kwargs) 
    wrapped.calls = 0 
    return wrapped 

class MyList(list): 
    @counted 
    def pop(self, *args, **kwargs): 
     return list.pop(self, *args, **kwargs) 

x = MyList([1, 2, 3, 4, 5]) 
for i in range(3): 
    x.pop() 

print x.pop.calls # prints 3 
+0

这简直是美丽的。谢谢! –

1

踢,我写了使用装饰的答案:

class counter: 
    #wraps a function, to keep a running count of how many 
    #times it's been called 
    def __init__(self, func): 
     self.func = func 
     self.count = count 

    def __call__(self, *args, **kwargs): 
     self.count += 1 
     return self.func(*args, **kwargs) 

要使用它,简单的装饰功能。然后您可以通过检查“count”属性来检查该函数运行了多少次。这样做很好,因为:

1.)没有全局变量。计数直接与函数关联。

2)你可以很容易地包裹内置功能,通过直接调用类:

sum_wrapped = counter(sum) 
sum_wrapped([1, 2 ,3, 4]) 
#outputs 10 
print sum_wrapped.count 
#outputs 1 

当然,这可以通过使用Decorators模块,以保持文档字符串和其他好东西原封不动加以改进。此外,要了解装修工的概况以及工作原理,请查看this stackoverflow answer

1

一种方法是创建要计数属性访问该实例的代理:

from collections import Counter 

class CountingProxy(): 
    def __init__(self, instance): 
     self._instance = instance 
     self.count = Counter() 

    def __getattr__(self, key): 
     if hasattr(self._instance, key): 
      self.count[key] += 1 
     return getattr(self._instance, key) 


>>> l = [1,2,3,4,5] 
>>> cl = CountingProxy(l) 
>>> cl.pop() 
5 
>>> cl.append(10) 
>>> cl.index(3) 
2 
>>> cl.reverse() 
>>> cl.reverse() 
>>> cl.count 
Counter({'reverse': 2, 'pop': 1, 'append': 1, 'index': 1}) 
+1

这个计数*访问*而不一定*调用*,这在某些情况下可能是一个重要的区别。例如'f = cl.pop; F(); F(); F();' – FogleBird

10

我用下面的小动作跟踪函数调用的次数

def myfun(s,i=[0]):  
    print(s)  
    i[0]+=1 # mutable variable get evaluated ONCE 
    return i[0] 

>>> myfun('aaa') 
aaa 
1 
>>> myfun('bbb') 
bbb 
2 
相关问题