如何计算Python 3.6中函数的调用次数?

时间:2018-06-14 11:35:20

标签: python python-3.x

我想计算f内函数inc的调用次数。我应该如何修改函数main来执行此操作?

我有这段代码:

def inc(f):
    f()
    f()

def main():
    a = 0
    def f():
        a += 1
    inc(f)
    print(a)  # should print 2

main()

但它会导致错误:

Traceback (most recent call last):
  File "main.py", line 11, in <module>
    main()
  File "main.py", line 9, in main
    inc(f)
  File "main.py", line 2, in inc
    f()
  File "main.py", line 8, in f
    a += 1
UnboundLocalError: local variable 'a' referenced before assignment

4 个答案:

答案 0 :(得分:6)

通常的方法是为您的函数func.invocations创建一个属性func,例如

def func(a):
    func.invocations += 1
    return a + 1

func.invocations = 0

并像

一样使用它
func(1)    # 2
func(10)   # 11
func.invocations  # 2

为了使整个事物更具可重用性和可读性,您还可以创建一个装饰器counter,它允许您计算您喜欢的任何函数的调用次数:

import functools

def counter(fn):
    @functools.wraps(fn)
    def helper(*args, **kargs):
        helper.invocations += 1
        return fn(*args, **kargs)
    helper.invocations = 0
    return helper

然后像

一样使用它
@counter
def func(a):
    return a + 1

func(1)    # 2
func(10)   # 11
func.invocations # 2

答案 1 :(得分:1)

def inc(f):
    f()
    f()

def main():
    a = 0
    def f():
        nonlocal a
        a += 1
    inc(f)
    print(a)  # should print 2

main()

在f()

中设置 a 非本地

答案 2 :(得分:0)

如果您正在寻找一个简单的解决方案,全局变量就可以解决问题。

reps = 0

def f():
    global reps 
    reps  += 1
    # do your func stuff here

f()
f()
f()
f()  # called f() 4 times
print(reps)  # -> 4

答案 3 :(得分:0)

你试试这个:

def inc(f):    
    f()    
    f() 


def main():    
    a = 0     
    def f():     
        f.counter += 1    
    f.counter =0    
    inc(f)     
    print(f.counter) 


main()

如何在python中使用函数,你可以创建一个属性来计算对该函数的调用次数