2017-03-16 7 views
1

함수를 호출하는 라이브러리 인 some_func을 사용하고 있습니다.다른 라이브러리에서 함수의 반환 값을 재정의하십시오.

def main(): 
    xs = [] 
    for x in y: 
     xs.append(some_func(x)) 
    return xs 

def some_func(x): 
    return some_data 

나는 some_func 기능의 응답을 차단하고 내 가치를 무시하고 싶습니다. 예를 들면 :

def some_func(x): 
    return my_func(some_data) 

그래서 그것을 프로세스를 완료하는 데 걸리는 시간을 추적하기 위해 일부 진전 훅을 실행할 수있다이 일의 목적.

어떻게하면 원본 라이브러리의 소스 코드를 수정하지 않고도이 작업을 수행 할 수 있습니까?

답변

1

데코레이터를 사용할 수 있지만 @으로 적용하는 대신 대상 함수를 직접 래핑합니다. 다음과 같이 입력하십시오 :

>>> import math 
>>> def wrap_function(func): 
...  def wrapper(x): 
...   print('Called {0} with {1}'.format(func.__name__, x)) 
...   result = func(x) 
...   print('Returned value is {0!r}'.format(result)) 
...   return result 
...  return wrapper 
... 
>>> math.sin = wrap_function(math.sin) 
>>> r = math.sin(1.1337) 
Called sin with 1.1337 
Returned value is 0.905984636371863 
>>> r 
0.905984636371863 

이제 통화 전후에 작업을 수행 할 수 있으므로 시간 측정 등을 구현할 수 있습니다.

+0

아 맞습니다. 고마워. –

0

정확하게 이해하고 있다면 데코레이터를 살펴 봐야합니다. 여기에 Andreas Jung의 스 니펫이 있습니다. 이렇게하면 선택한 모든 함수에 @timeit 데코레이터를 추가 할 수 있습니다.

import time             

def timeit(method): 

    def timed(*args, **kw): 
     ts = time.time() 
     result = method(*args, **kw) 
     te = time.time() 

     print '%r (%r, %r) %2.2f sec' % \ 
       (method.__name__, args, kw, te-ts) 
     return result 

    return timed 

class Foo(object): 

    @timeit 
    def foo(self, a=2, b=3): 
     time.sleep(0.2) 

@timeit 
def f1(): 
    time.sleep(1) 
    print 'f1' 

@timeit 
def f2(a): 
    time.sleep(2) 
    print 'f2',a 

@timeit 
def f3(a, *args, **kw): 
    time.sleep(0.3) 
    print 'f3', args, kw 

f1() 
f2(42) 
f3(42, 43, foo=2) 
Foo().foo() 
관련 문제