Python:Decorator中的Lambda函数细节

2024-09-28 03:16:53 发布

您现在位置:Python中文网/ 问答频道 /正文

正在尝试将执行进程(测试,a,b)名称添加到我正在计算运行时间的装饰中。需要建议

最终预期日志:

Process **a** elapsed time :3.8 || Rowcount=1833

Process **test** elapsed time :7.8 || Rowcount=1133

代码

import time
from queries import a,b,test

def elapsedTimeTracker_decorator(func):
      def wrapper():
        start_time = time.time()
        func()
        print(test)
        end_time = time.time()
        elapsed_time = end_time - start_time
        print('elapsed_time:'+ str(elapsed_time) +'||' + 'RowCount:' + str(cursor.rowcount))
      return wrapper


    print "Process a started"
    elapsedTimeTracker_decorator(lambda: cursor.execute(a))()
    print "Process Test started"
    elapsedTimeTracker_decorator(lambda: cursor.execute(Test))()
    print "Process b started"
    elapsedTimeTracker_decorator(lambda: cursor.execute(b))()

甲、乙及丙;测试由SQL更新查询组成

test = """INSERT INTO users
select * from user_all where user_id=54549172 """

Tags: lambdafromtestimportexecutetimedefdecorator
1条回答
网友
1楼 · 发布于 2024-09-28 03:16:53

如果希望为不带参数的修饰lambda打印额外数据,则必须将其传递给修饰器:

def elapsedTimeTracker_decorator(func, test):
    def wrapper():
        start_time = time.time()
        func()
        print(f'Process {test} elapsed time: {time.time() - start_time} || Rowcount={cursor.rowcount}')
    return wrapper

elapsedTimeTracker_decorator(lambda: cursor.execute(test), test)()

除此之外,我不知道你的test应该来自哪里。如果这不是一个合适的解决方案,请详细说明

编辑:根据提供的最新信息,显然您不需要使用lambda,也不需要使用带有内部包装的装饰器。您可以简单地使用一个简单的函数来调用给定的函数,该函数使用提供的参数和关键字来处理调用以及打印执行时间。例如:

from time import time as now

def time_call(func, *args, **kwargs):
    cur = now()
    func(*args, **kwargs)
    print(
        f'Executing {func.__qualname__}({repr(args)[1:-1]}, ' +
        f'{"".join(f"{k}={v}" for k, v in kwargs.items())}) took ' +
        f'{now() - cur} seconds.'
    )

def test(foo, bar, baz):
    pass

time_call(test, 'foo', 'bar', baz=None)

这会打印出如下内容:

Executing test('foo', 'bar', baz=None) took 0.0 seconds.

相关问题 更多 >

    热门问题