Python中多代码行的函数包装器

Python中多代码行的函数包装器,python,python-decorators,Python,Python Decorators,我想围绕一个函数编写一些代码,例如打印计时信息,并将此函数用于多个代码块: 开始=时间 打印“开始在{}添加数字”。格式开始 a=1 b=2 c=a+b 结束=时间 打印“在{}秒内完成添加数字”。formatend-start 是否可以将多行代码封装到一个包装函数中,而不为每个代码块定义函数?一种方法是定义函数并使用装饰器,但我希望避免对每个代码块都这样做: @打印时间 def foo: a=1 b=2 返回a+b Yu可以使用更高阶的函数来实现这一点,例如: def inner():

我想围绕一个函数编写一些代码,例如打印计时信息,并将此函数用于多个代码块:

开始=时间 打印“开始在{}添加数字”。格式开始 a=1 b=2 c=a+b 结束=时间 打印“在{}秒内完成添加数字”。formatend-start 是否可以将多行代码封装到一个包装函数中,而不为每个代码块定义函数?一种方法是定义函数并使用装饰器,但我希望避免对每个代码块都这样做:

@打印时间 def foo: a=1 b=2 返回a+b
Yu可以使用更高阶的函数来实现这一点,例如:

def inner():
    pass

def outer(inner):
    inner()
然后打电话

outer(inner)

Yu可以使用更高阶的函数来实现这一点,例如:

def inner():
    pass

def outer(inner):
    inner()
然后打电话

outer(inner)

备选方案您对此有何看法:

您定义了一个定时器类,该类按名称(例如代码块的描述)保存定时器,并将您喜欢的所有打印和dos作为选项放入stop_timer函数中。这仍然是两行代码,但我不认为你会得到比这少

import time as t

class myTimer:
    def __init__(self):
        self.timers = {}
    def start_timer(self, name):
        print('Started adding numbers at {}'.format(t.time()))
        self.timers[name] = t.time()
    def stop_timer(self,name):
        runtime = t.time() - self.timers[name]
        del(self.timers[name])
        print('Finished adding numbers in {} seconds'.format(runtime))
        return runtime

timer = myTimer()


timer.start_timer('First Timer')
timer.start_timer('Second Timer')
a = 1
t.sleep(1)
b = 2
timer.stop_timer('First Timer')
c = 3
t.sleep(2)
d = 4
timer.stop_timer('Second Timer')
返回

Started adding numbers at 1606676633.8297324
Started adding numbers at 1606676633.8297324
Finished adding numbers in 1.0228865146636963 seconds
Finished adding numbers in 3.0250420570373535 seconds

备选方案您对此有何看法:

您定义了一个定时器类,该类按名称(例如代码块的描述)保存定时器,并将您喜欢的所有打印和dos作为选项放入stop_timer函数中。这仍然是两行代码,但我不认为你会得到比这少

import time as t

class myTimer:
    def __init__(self):
        self.timers = {}
    def start_timer(self, name):
        print('Started adding numbers at {}'.format(t.time()))
        self.timers[name] = t.time()
    def stop_timer(self,name):
        runtime = t.time() - self.timers[name]
        del(self.timers[name])
        print('Finished adding numbers in {} seconds'.format(runtime))
        return runtime

timer = myTimer()


timer.start_timer('First Timer')
timer.start_timer('Second Timer')
a = 1
t.sleep(1)
b = 2
timer.stop_timer('First Timer')
c = 3
t.sleep(2)
d = 4
timer.stop_timer('Second Timer')
返回

Started adding numbers at 1606676633.8297324
Started adding numbers at 1606676633.8297324
Finished adding numbers in 1.0228865146636963 seconds
Finished adding numbers in 3.0250420570373535 seconds

您可以创建一个上下文管理器类,并在with块中执行代码。这将有助于实现紧凑且高度可重用的计时器功能。大概是这样的:

import time

class TimeClass():
    def __init__(self):
        pass
    def __enter__(self):
        self.start = time.time()
    def __exit__(self, type, value, traceback):
        self.end = time.time()
        print('Finished executing in {} seconds'.format(self.end - self.start))
with TimeClass():
    # your code
    pass
您可以像这样使用该类:

import time

class TimeClass():
    def __init__(self):
        pass
    def __enter__(self):
        self.start = time.time()
    def __exit__(self, type, value, traceback):
        self.end = time.time()
        print('Finished executing in {} seconds'.format(self.end - self.start))
with TimeClass():
    # your code
    pass

查看更多详细信息。

您可以创建一个上下文管理器类,并在with块中执行代码。这将有助于实现紧凑且高度可重用的计时器功能。大概是这样的:

import time

class TimeClass():
    def __init__(self):
        pass
    def __enter__(self):
        self.start = time.time()
    def __exit__(self, type, value, traceback):
        self.end = time.time()
        print('Finished executing in {} seconds'.format(self.end - self.start))
with TimeClass():
    # your code
    pass
您可以像这样使用该类:

import time

class TimeClass():
    def __init__(self):
        pass
    def __enter__(self):
        self.start = time.time()
    def __exit__(self, type, value, traceback):
        self.end = time.time()
        print('Finished executing in {} seconds'.format(self.end - self.start))
with TimeClass():
    # your code
    pass
查看更多详细信息。

另一种方法是使用

例如:

从contextlib导入contextmanager @上下文管理器 def定时器: 开始=时间 打印“开始在{}添加数字”。格式开始 产量 结束=时间 打印“在{}秒内完成添加数字”。formatend-start 那就这样说吧 带计时器: a=1 b=2 c=a+b 另一种方法是使用

例如:

从contextlib导入contextmanager @上下文管理器 def定时器: 开始=时间 打印“开始在{}添加数字”。格式开始 产量 结束=时间 打印“在{}秒内完成添加数字”。formatend-start 那就这样说吧 带计时器: a=1 b=2 c=a+b
我明确指出,我不想定义额外的函数来包装代码块。我明确指出,我不想定义额外的函数来包装代码块