2014-02-12 4 views
14

그래서 메서드를 호출 한 횟수를 추적하는 함수를 만들려고합니다. 예를 들어 :함수가 호출 된 횟수를 추적하는 방법이 있습니까?

내가 지금까지 그렇게이 예를 들어()를 호출 된 a.pop 얼마나 많은 시간을 알고 싶어
a = [1,2,3,4] 
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() 

이렇게하면 문제가 해결되어 계산되는 항목을 볼 수 있습니다. + 함수를 호출 할 때마다 카운터가 증가하고 함수의 모든 패스와 함께 인쇄됩니다. 내장 ITS 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 메서드를 장식하거나 바꿀 수 없으므로 자신의 목록 클래스를 사용해야합니다.

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) 

단순히 기능을 장식,이 기능을 사용하려면

차기를 들어
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

, 나는 장식을 사용하여 답을 썼다. 그런 다음 "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();' – 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 
관련 문제