Comments 7
itertools.islice(range(50), 10, 20)
Забавно, но это плохой пример. Во втором питоне результатом range(50)
будет список, и срез его можно, очевидно получить сразу. А в Python3 (хотя не уверен во всех ли версиях) результат range(50)
— это хоть и генератор, но особый, с поддержкой протокола срезов.
В таком вот примере следовало бы вместо range(50)
использовать (i**2 for i in range(50))
. Квадрат для пущего подавления бессмысленности примера.
+4
Для обеспечения его работы нужно лишь чтобы были объявлены операторы сравнения lt и eq. Это — тот минимум, который нужен декоратору для конструирования остальных операторов сравнения.
На самом деле достаточно, чтобы была объявлена любая пара методов, на основе которой можно восстановить остальные. К примеру это может быть __ne__
и __ge__
.
+1
UFO just landed and posted this here
Если вы попытаетесь получить срез (slice) итератора, то столкнётесь с ошибкой TypeError, сообщающей о том, что на объект-генератор нельзя оформить подписку.
Хочу оформить подписку на объект-генератор. Как я могу это сделать?
0
character_map = {
ord('\n') : ' ',
ord('\t') : ' ',
ord('\r') : None
}
Можно так записать:character_map = str.maketrans('\n\t', ' ', '\r')
+3
В вышеприведённом примере экспортирована будет лишь функция bar. А если оставить атрибут __all__ пустым, то из модуля не будет экспортироваться вообще ничего. При попытке импорта чего-либо из такого модуля будет выдана ошибка AttributeError.
Разве? Насколько мне известно, по полному имени функцию (сабмодуль/класс/итд) можно импортировать вне зависимости от
__all__
, он влияет только на import * from bar
. В доке я тоже не нашел ничего подобного.+1
На сайте с официальной документацией по contextlib размещен пример создания менеджера контекста с помощью декоратора @contextmanager. Вы не обозначили возмонжости, которые он предоставляет.
Действительно, при входе в блок with выполняется код до оператора yield. Но вы не обозначили, что с помощью yield можно вернуть объект на который можно сослаться с помощью оператора as внутри блока with.
Также, необходимо обернуть оператор yield в блок try/except/finally. finally является аналогом метода __exit__ и гарантирует нам, что при любом выходе из блока with выполнится завершающий код (например, закрытие db). Блок except необходим для обработки исключений возникших внутри блока with.
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.
+1
Sign up to leave a comment.
Полезные советы по Python, которых вы ещё не встречали