2017-03-16 19 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関数の応答を傍受し、それを自分の値で上書きしたいと考えています。例:

これを行う目的は、処理を完了するのにかかる時間を追跡するためにいくつかのprogress-hookを実行できるようにすることです。

元のライブラリのソースコードを変更せずにこれを行うにはどうすればよいですか?

答えて

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() 
関連する問題