Что такое диспетчеры контекста в Python?

На своей работе я недавно узнал о важности использования контекстного менеджера. Мне нужно было создать файл Excel и хранить несколько листов в среде AWS. Сначала я не использовал контекстный менеджер, но через некоторое время обнаружил, что файл сохраняется неправильно, несмотря на то, что делал это дважды в предыдущие месяцы.

Что такое менеджеры контекста?

Контекстные менеджеры позволяют точно назначать и освобождать ресурсы, когда они вам нужны. Оператор with является наиболее распространенным примером менеджера контекста. Предположим, у вас есть две связанные операции, которые вы хотите запустить как пару, разделенные блоком кода. Контекстные менеджеры позволяют сделать именно это.

В первом примере показано хранилище с использованием менеджера контекста.

import pandas as pd
# create two data DataFrames
df1 = pd.DataFrame({'dataset':['A', 'B', 'C', 'D', 'E']})
df2 = pd.DataFrame({'dataset':[3, 12, 18, 21]})
writer = pd.ExcelWriter('dataframes.xlsx', engine = 'xlsxwriter')
df1.to_excel(writer, sheet_name = 'first')
df2.to_excel(writer, sheet_name = 'second')
# close the DataFrames
writer.save()

Однако, несмотря на то, что я всегда работал на своем ПК, я обнаружил, что этот подход был сомнительным в среде AWS. Я рекомендую использовать диспетчер контекста в любом случае после изменчивых результатов в среде AWS.

# Using a context manager, saving in the file happens automatically
with pd.ExcelWriter('dataframes.xlsx') as writer:
     df1.to_excel(writer, sheet_name = 'first', index = False)
     df2.to_excel(writer, sheet_name = 'second', index = False)

Менеджер контекста также весьма удобен, если у вас есть список DataFrames.

frames = [df1, df2, df3, df4]
sheets = ['first', 'second', 'third', 'fourth']
with pd.ExcelWriter('dataframes.xlsx') as writer:
     for f, frame in enumerate(frames):
          frame.to_excel(writer, sheets = names[f])

Используя enumerate, я также могу составить список имен для каждого листа по мере того, как перебираю кадры. Довольно просто и по-питоновски, наслаждайтесь!

Спасибо за чтение.

Больше контента на plainenglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку здесь.