👍2👎1
«При продумывании смысла имен в коде, основанном на классах, полезно помнить о том, что классы в точности как функции вводят локальные области видимости, а методы являются просто более вложенными функциями. В следующем примере функция generate возвращает экземпляр вложенного класса Spam. Внутри своего кода имя класса Spam присваивается в локальной области видимости функции generate и потому оно доступно любой вложенной функции, включая код в method; это соответствует букве Е в правиле LEGB:
def generate():
class Spam: # Spam - имя в локальной области видимости generate
count = 1
def method(self):
print(Spam.count) # Согласно правилу LEGB (E) доступно в области видимости generate
return Spam()
generate().method()
... локальные области видимости всех операторов def объемлющих функций автоматически видны вложенным def».
👍3👎1
👍2👎1
«Оператор with используется для обертывания выполнения блока методами, определенными менеджером контекста (см. раздел Менеджеры контекста оператора With)».
Оператор with / as запускает логику управления контекстом объекта, чтобы гарантировать
выполнение действий при завершении безотносительно к любым исключениям
в его вложенном блоке:
with open('lumberjack.txt', 'w') as file:
file.write('Лиственница!')
# Попытка обратиться к несуществующему атрибуту
file.nonexistent_method() # AttributeError
Файл все равно будет создан, хоть программа и выпадет в исключение:
AttributeError: '_io.TextIOWrapper' object has no attribute 'nonexistent_method'
👍2👎1
сохранять внутреннее состояние между вызовами next(), даже когда происходят исключения.
«При вызове функции-генератора возвращается итератор, известный как генератор. Этот генератор затем управляет выполнением функции-генератора (counter). Выполнение начинается при вызове одного из методов генератора. В этот момент выполнение переходит к первому выражению yield, где снова приостанавливается, возвращая значение yield_list вызывающей стороне генератора или None, если yield_list опущен. Под приостановкой мы подразумеваем сохранение всего локального состояния, включая текущие привязки локальных переменных, указатель инструкций, внутренний стек вычислений и состояние обработки любых исключений».
👍3
«Целевое назначение конструкции else не всегда сразу очевидно для новичков в Python. Однако без нее отсутствует прямой способ сообщить (без установки и проверки булевских флагов), продолжил поток управления выполнение после оператора try из-за того, что никаких исключений не возникало или же исключение произошло и обработано. В любом случае мы оказываемся после оператора try:
try:
...выполнить код...
except IndexError:
...обработать исключение...
# Мы сюда попали из-за того, что try потерпел неудачу или же прошел?
Во многом подобно тому, как конструкции else в циклах придают причине выхода
большую очевидность, конструкция else предоставляет в операторе try синтаксис,
который делает то, что произошло, ясным и недвусмысленным:
try:
...выполнить код...
except IndexError:
...обработать исключение...
else:
...исключения не возникали...»
👍2🔥1