Translate Yielding None example

This commit is contained in:
Vadim Nifadev 2024-04-22 14:05:53 +03:00
parent 972d1334fb
commit ecaab6dca1
1 changed files with 33 additions and 0 deletions

View File

@ -1511,3 +1511,36 @@ True
* Оператор += изменяет объект на месте, не создавая новый объект. Таким образом, изменение атрибута одного экземпляра влияет на другие экземпляры и атрибут класса также.
---
### ▶ Возврат None из генератора
<!-- Example ID: 5a40c241-2c30-40d0-8ba9-cf7e097b3b53 --->
```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]
<generator object <listcomp> 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`.
---