Сериал-101 возвращается
Сериал-101 возвращается.
Очень хочу проскочить скучные вопросы, но имею привычку быть последовательным.
Я и так отвлекал вас, как мог, картинками. Можно сказать, прокрастинировал.
#34 Для чего используется ключевое слово yield?
yield - это как return, только для генератора.
#35 Чем отличаются __iter__ и __next__?
Как мы уже разбирали выше, __iter__ - это магический метод, возвращающий сам итератор, а __next__ - это метод перебора по нему.
#36 Что такое контекстный менеджер?
Когда мы пишем что-то вроде:
with DatabaseConnection() as dbconn:
‧‧‧‧...
происходит вот что:
- создается объект DatabaseConnection
- вызывается магический метод __enter__
- возвращаемое значение присваивается переменной dbconn
- после выражения with вызывается метод __exit__
class DatabaseConnection(object):
‧‧‧‧def __enter__(self):
‧‧‧‧‧‧‧‧# Здесь нужно создать соединение с БД
‧‧‧‧‧‧‧‧# и вернуть его через return
‧‧‧‧‧‧‧‧...
‧‧‧‧‧‧‧‧return self.dbconn
‧‧‧‧def __exit__(self, exc_type, exc_val, exc_tb):
‧‧‧‧# Здесь нужно закрыть базу
‧‧‧‧self.dbconn.close()
‧‧‧‧...
Пример, конечно, тот ещё. Открытие-закрытие базы на каждую единичную транзакцию убьёт производительность решения чуть более, чем полностью. Но это всего лишь пример.
Контекстному менеджеру with посвящен PEP 343 (https://peps.python.org/pep-0343/)
#сериал101, #34, #35, #36
Это кросспост из моего Telegram-канала "Не Ван Россум", где я прямо сейчас пишу сериал "101 вопрос про Python" с описанием подводных камней, неочевидностей и загвоздок.