Как автоматизировать операции с контекстом Python
Часто участки кода требуется дополнять одними и теми же инструкциями. Например, для добавления времени исполнения строк или автоматического открытия и закрытия файла. Эти действия можно автоматизировать при помощи декоратора contextmanager из модуля contextlib.
Техника его применения заключается в декорировании некоторой функции, в которой выполняются необходимые вам повторяющиеся действия, а точкой входа для изменяемого кода является строка с инструкцией yield. Например, так можно создать контекст измерения времени:
import numpy as np
from time import time
from contextlib import contextmanager
@contextmanager
def code_time():
start = time()
yield
print(time() - start)Для задания контекста достаточно вызвать функцию в блоке инструкции with, куда и поместить новый код:
with code_time():
ar1 = np.random.normal(0, 3, size=(1000,1000))
ar2 = np.random.normal(-2, 3, size=(1000,1000))
sum = ar1 + ar2Бывает, что некоторые объекты из контекста требуется использовать в блоке с изменяемым кодом. Для этого укажите их после инструкции yield. Например, так создается контекст файла с инструкцией with (подобно известному способу):
@contextmanager
def writefile(fn):
try:
f = open(fn,'w')
yield f
finally:
f.close()А теперь запишем строку в файл новым способом:
with writefile('temp.txt') as f:
f.write('Привет')