Skip to content
Permalink
Branch: master
Find file Copy path
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
81 lines (56 sloc) 3.23 KB

Про PEP-572 (Assignment Expressions)

PEP-572 -- тренд недели в Python сообществе. Данный PEP добавляет в Python синтаксис присваивания, который можно использовать внутри if, for, while, list comprehensions. И вот этот PEP Гвидо ван Россум принял в этот вторник, ждите фичу в Python 3.8. А причина оживлённой дискуссии в том, что это поощряет плохой код и является ужасно неинтуитивным. 91% Python core developers проголосовал против данного PEP. Ниже я рассказываю, что же с этим синтаксисом, по моему мнению, не так.

Читаемость

Вот пример из документации:

if any((comment := line).startswith('#') for line in lines):
    print("First comment:", comment)
else:
    print("There are no comments")

А вот я переписал его для вас на pythonic код:

for line in lines:
    if line.startswith('#'):
        print("First comment:", line)
        break
else:
    print("There are no comments")

Болезненная итерация

Ещё одна проблема в том, что из Python будут делать PHP

Python стиль итерации:

for user in get_users():
    ...

PHP стиль итерации:

while user := get_users():
    ...

Стреляем в ногу

А ещё с таким синтаксисом сделать больно очень просто:

[(y := z(x), y) for x in data if (y := f(x)) is not None]

Сжимаем

Но основная проблема в том, что код становится очень сжатым. Это ведь Python, а не Perl. Вот пример из документации:

filtered_data = [y for x in data if (y := f(x)) is not None]

Нормальный подход -- не пытаться всё запихнуть в генераторы списков:

filtered_data = []
for x in data:
    y = f(x)
    if y is not None:
        filtered_data.append(y)

Боитесь, что в файле закончатся строки? Я -- нет. И не то чтобы генераторы списков сейчас не позволяют сделать то же самое:

filtered_data = [y for y in (f(x) for x in data) if y is not None]

Что дальше?

В общем, боюсь, нас впереди ждёт много страшного кода в Open Source проектах, так что держитесь.

Ну и резюмируя. Так стоит ли использовать новый синтаксис, когда он приедет в Python? Почему бы и нет. Тут всё как всегда: думайте головой и не пишите плохой код. Be happy.

You can’t perform that action at this time.