Как стать автором
Обновить

Комментарии 7

itertools.islice(range(50), 10, 20)

Забавно, но это плохой пример. Во втором питоне результатом range(50) будет список, и срез его можно, очевидно получить сразу. А в Python3 (хотя не уверен во всех ли версиях) результат range(50) — это хоть и генератор, но особый, с поддержкой протокола срезов.
В таком вот примере следовало бы вместо range(50) использовать (i**2 for i in range(50)). Квадрат для пущего подавления бессмысленности примера.

Для обеспечения его работы нужно лишь чтобы были объявлены операторы сравнения lt и eq. Это — тот минимум, который нужен декоратору для конструирования остальных операторов сравнения.

На самом деле достаточно, чтобы была объявлена любая пара методов, на основе которой можно восстановить остальные. К примеру это может быть __ne__ и __ge__.

НЛО прилетело и опубликовало эту надпись здесь
Если вы попытаетесь получить срез (slice) итератора, то столкнётесь с ошибкой TypeError, сообщающей о том, что на объект-генератор нельзя оформить подписку.

Хочу оформить подписку на объект-генератор. Как я могу это сделать?

character_map = {
 ord('\n') : ' ',
 ord('\t') : ' ',
 ord('\r') : None
}
Можно так записать:
character_map = str.maketrans('\n\t', '  ', '\r')

В вышеприведённом примере экспортирована будет лишь функция bar. А если оставить атрибут __all__ пустым, то из модуля не будет экспортироваться вообще ничего. При попытке импорта чего-либо из такого модуля будет выдана ошибка AttributeError.

Разве? Насколько мне известно, по полному имени функцию (сабмодуль/класс/итд) можно импортировать вне зависимости от __all__, он влияет только на import * from bar. В доке я тоже не нашел ничего подобного.
На сайте с официальной документацией по contextlib размещен пример создания менеджера контекста с помощью декоратора @contextmanager. Вы не обозначили возмонжости, которые он предоставляет.

from contextlib import contextmanager

@contextmanager
def tag(some_val):
  print(some_val)
  try:
    yield 2
  except:
    print("was exception!")
  finally:
    print("end")

with tag("test") as val:
  print(val)
  a = 2 / 0


Действительно, при входе в блок with выполняется код до оператора yield. Но вы не обозначили, что с помощью yield можно вернуть объект на который можно сослаться с помощью оператора as внутри блока with.
Также, необходимо обернуть оператор yield в блок try/except/finally. finally является аналогом метода __exit__ и гарантирует нам, что при любом выходе из блока with выполнится завершающий код (например, закрытие db). Блок except необходим для обработки исключений возникших внутри блока with.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий