簡體   English   中英

如何通過裝飾器使用任何函數,而不管其在 Python 中的參數如何

[英]How to use any function by a decorator regardless of its arguments in Python

我正在尋找一個函數,它將返回執行任何其他函數所需的時間(也許它可以用一個庫來完成,但原則上我希望在本地實現它)。 我希望以本機方式實現它),先驗它似乎很容易,它可以使用裝飾器或通過參數接收函數的經典函數來完成:

def get_function_time(function):
   start_time = time.time()
   function()

return time.time() - start_time

當然,這只適用於沒有參數的函數,在這種情況下,我們可以告訴它為函數傳遞參數:

def get_function_time(function, parameter):
   start_time = time.time()
   function(parameter)

return time.time() - start_time

在這里,當調用參數多於或少於一個的函數時,我們會遇到同樣的問題。 然后我的疑問就來了,有沒有一種方法可以使用裝飾器或沒有裝飾器,根據元素的數量我在函數中發送相同數量的參數。

對於我需要做的一些測試,我實現了這個糟糕的解決方案,考慮到我沒有超過 5 個參數的函數。 超過 5 個 argmuentos 的功能為我服務。

def get_function_time(function, parameters: list):

   start = time.time()

   parameters_num = len(parameters)
   if len(parameters) > 6: raise ValueError("Max 5 arguments")

   if parameters_num == 0:
        function()
   elif parameters_num == 1:
        function(parameters[0])
   elif parameters_num == 2:
        function(parameters[0], parameters[1])
   elif parameters_num == 3:
        function(parameters[0], parameters[1], parameters[2])
   elif parameters_num == 4:
        function(parameters[0], parameters[1], parameters[2], parameters[3])
   elif parameters_num == 5:
        function(parameters[0], parameters[1], parameters[2], parameters[3], parameters[4])

   return time.time() - start

但是我留下了一個問題,即如何以動態的方式來測量任何函數,不管它的參數是什么(當然,只要它們很好地傳遞了它們的參數)。

抱歉,如果寫問題的方式不是最好的,我在這里沒有太多經驗。

如果我猜對了,您需要的是*args**kwargs ,這意味着按順序的參數和按關鍵字的參數。

例如

def get_function_time(function, *args, **kwargs):

    start = time.time()
    function(*args, **kwargs)
    return time.time() - start

那么你可以像這樣使用它

get_function_time(function, 'abc', 'def', keyword1='ghi', keyword2='jkl')

這相當於調用function

function('abc', 'def', keyword1='ghi', keyword2='jkl')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM