2016-04-27 6 views
2

私はタイトルがちょっと混乱していることを知っています。他の関数のパラメータを持つ関数をPythonで呼び出す方法は?

だから、私は例として、このコードを見てみましょう:

import timeit 

def test1(x,y): 
    return x*y 

def time_cost(func): 
    start = timeit.default_timer() 
    func() 
    stop = timeit.default_timer() 

    print(stop - start) 

time_cost(test1) 

私はtime_cost関数に、TEST1の2パラメータ、xとyを与えたいです。

しかし、私はそうする方法を知らない。

私は前にこれを試してみました:

import timeit 

def test1(x,y): 
    return x*y 

def time_cost(func): 
    start = timeit.default_timer() 
    func 
    stop = timeit.default_timer() 

    print(stop - start) 

time_cost(test1(1,2)) 

それは実行することができますが、結果は、私は、これは間違っていると信じていることをとても奇妙です。

これを行うにはどうすればよいですか?皆さん、ありがとうございました。

+0

1つのアキュームメント( 'func')だけを受け入れるなら' time_cost'への引数として 'x'と' y'を与えることはできません。 'time_cost'が他の引数を受け入れるようにするには、他の引数を受け入れるように書き直す必要があります。 – BrenBarn

+0

クロージャ、デコレータ、ラッパーという用語を読んでみましょう。基本的な考え方は、あなたが望むようにあなたの関数を新しい関数に置き換え( "ラップ")、必要な方法で引数を扱うことです。 –

答えて

4

必要な機能を返します。

def time_cost(func): 
    def run(*args, **kwargs): 
     start = timeit.default_timer() 
     func(*args, **kwargs) 
     stop = timeit.default_timer() 

     print(stop - start) 
    return run 

これを呼び出します。

time_cost(test1)(1, 2) 
+0

あなたの答えはとても良いです!ありがとうございました! –

2

これを試してください。

from functools import wraps 
import timeit 

def time_cost(func): 
    @wraps(func) 
    def wrapper(*args, **kwargs): 
     start = timeit.default_timer() 
     result = func(*args, **kwargs) 
     stop = timeit.default_timer() 
     print(stop - start) 
     return result 
    return wrapper 

test1 = time_cost(test1) 
test1(1,2) 

この種の機能はデコレータと呼ばれます。ラッパーまたはクロージャーとも呼ばれます。

また、デコレータ構文でこれを使用することができます。

@time_cost 
def test1(x,y): 
    return x*y 

test1(1,2) 

これは、上記のコードと同じこと。

+0

あなたの方法は少し秘密のようです。何でも、本当にありがとうございます! –

+0

@MarsLeeこれはおそらく、おそらくこの種のことをPythonで行うための好ましい方法です。 IVAの最初の回答と同じですが、ちょっと違うだけです。参照:https://www.python.org/dev/peps/pep-0318/#abstract –

関連する問題