Russian Articles

Про 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.

created: 2018-07-04 (Wed) updated: 2019-02-21 (Thu) views: 113

Contributors

orsinium telezhnaya delimitry