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