그래서 메서드를 호출 한 횟수를 추적하는 함수를 만들려고합니다. 예를 들어 :함수가 호출 된 횟수를 추적하는 방법이 있습니까?
내가 지금까지 그렇게이 예를 들어()를 호출 된 a.pop 얼마나 많은 시간을 알고 싶어a = [1,2,3,4]
a.pop()
, 내가 1 을 얻을 것이 할 수있는 방법이 있나요?
그래서 메서드를 호출 한 횟수를 추적하는 함수를 만들려고합니다. 예를 들어 :함수가 호출 된 횟수를 추적하는 방법이 있습니까?
내가 지금까지 그렇게이 예를 들어()를 호출 된 a.pop 얼마나 많은 시간을 알고 싶어a = [1,2,3,4]
a.pop()
, 내가 1 을 얻을 것이 할 수있는 방법이 있나요?
이 작업을 수행하는 간단한 방법은 함수를 호출 할 때마다 전역 변수를 증가시키는 것입니다.
counter = 0
a = [1,2,3,4]
a.pop()
counter += 1
나는 믿습니다. OP는'a.pop()'가 몇 번 호출되었는지를 알고 싶어합니다. 기본적으로 코드가 일정 기간 동안 실행 된 횟수를 세고 있습니다. – enginefree
그래, 기본적으로 내 자신의 클래스를 만들고 있었고 메소드가 호출 된 횟수를 계산할 필요가 있었지만 지금은 알아 냈습니다. 모두 도움을 주셔서 감사합니다. – user3050527
이 내장 기능이 작동하지 않습니다,하지만 흥미로운 접근 방식은 다음과 같습니다
def myfunction():
myfunction.counter += 1
myfunction.counter = 0
당신은 기능을하는 속성을 제공하고, 그래서 모든는 그 속성이 업데이트 될 때 호출합니다. 전역 변수가 필요하지 않습니다.
내장은 읽기 전용입니다. 그들은 수정할 수 없습니다.
고맙습니다. 이것은 나의 하루를 절약합니다. – lanenok
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
이의 논리가이 새로운 기능은 미리 만들어진 후 다음 기능을 내장하고 밖으로 나오되는 함수로 이동 호출을 표시 갈 것입니다
카운터가 증가했습니다. 카운터를 출력하십시오.
iirc 함수에서 글로벌 범위에서 수정할 수 있기 전에 변수를 전역 화해야합니다. – icedtrees
감사합니다. 추가하는 것을 잊어 버렸습니다. : p – castaway2000
함수가 호출 된 횟수를 추적하는 데코레이터를 사용할 수 있습니다. 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
이것은 간단합니다. 감사! –
, 나는 장식을 사용하여 답을 썼다. 그런 다음 "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을 확인하십시오.
한 가지 방법은 액세스 속성 계산하고자하는 인스턴스의 프록시를 만드는 것입니다 :
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})
이것은 * 액세스 *를 계산하고 반드시 * 호출 *은 아니더라도 일부 경우에는 중요한 구분 일 수 있습니다. 예 : 'f = cl.pop; 에프(); 에프(); f();' – FogleBird
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
은 내장 함수가 아닌 자신의 함수로 쉽게 수행 할 수 있습니다. – roippi
전역 변수를 만들거나 참조로 – wipindipy10
함수를'pop' 함수로 전달하면'counter'라는 변수를 정의한 다음 그 함수의 첫 번째 줄에서'counter + = 1'을 수행 할 수 있습니다. 또는 그와 비슷한 것 – enginefree