diff --git a/translations/README-ru.md b/translations/README-ru.md index 23a67c5..5f3f4bb 100644 --- a/translations/README-ru.md +++ b/translations/README-ru.md @@ -1511,3 +1511,36 @@ True * Оператор += изменяет объект на месте, не создавая новый объект. Таким образом, изменение атрибута одного экземпляра влияет на другие экземпляры и атрибут класса также. --- + + +### ▶ Возврат None из генератора + +```py +some_iterable = ('a', 'b') + +def some_func(val): + return "something" +``` + +**Результат (<= 3.7.x):** + +```py +>>> [x for x in some_iterable] +['a', 'b'] +>>> [(yield x) for x in some_iterable] + at 0x7f70b0a4ad58> +>>> list([(yield x) for x in some_iterable]) +['a', 'b'] +>>> list((yield x) for x in some_iterable) +['a', None, 'b', None] +>>> list(some_func((yield x)) for x in some_iterable) +['a', 'something', 'b', 'something'] +``` + +#### 💡 Объяснение: +- Это баг в обработке yield в генераторах и списочных выражениях CPython. +- Исходный код и объяснение можно найти [здесь](https://stackoverflow.com/questions/32139885/yield-in-list-comprehensions-and-generator-expressions) +- Связанный [отчет об ошибке](https://bugs.python.org/issue10544) +- В Python 3.8+ yield внутри списочных выражений больше не допускается и выдает `SyntaxError`. + +---