Pull to refresh

Comments 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__.

UFO just landed and posted this here
Если вы попытаетесь получить срез (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.
Sign up to leave a comment.