Реклама
Комментарии 23

Не работает как тернарный оператор:


(download_huge_file(), sys.exit(1))[not os.file.exists(...) and input("Файл не найден. Скачать?") == "yes"]

Хотя даже если знать о том, что будут выполняться обе ветки выражения (до выполнения условия!), и использовать как в посте — для возврата правильного значения, будут созданы лишние обьекты.

работает. лишние объекты (кроме самих лямбд) не создаются.


(lambda: sys.exit(1), lambda: download_huge_file())[not os.path.exists('123') and input("Файл не найден. Скачать?") == "yes"]()

Что бы так писать, нужно ну очень сильно не любить ключевые слова if/else. Но — так работает, согласен.

Я не спец в Python, но выглядит это как кортеж на два элемента и приложенный к нему индексатор. Предполагая, что True это 1, а False это 0.
Как уже написано выше, при создаии кортежа, скорее всего, выполнятся оба выражения, из-за чего все преимущество тернарного оператора теряется.

это как кортеж на два элемента и приложенный к нему индексатор

так и есть

Можно написать


(lambda: false_clause, lambda: true_clause)[condition]()

, но это расточительно даже по меркам Python.

НЛО прилетело и опубликовало эту надпись здесь
Предполагая, что True это 1, а False это 0.

Это не "предполагая", а приведение типов.
Логического к целому.

Классика же из perl
my $max = ($x, $y)[$x < $y];
my $min = ($x, $y)[$x > $y];

Оно же в Python
>>> x = 10
>>> y = 20
>>> max = (x, y)[x<y]
>>> max
20
>>> min = (x, y)[x>y]
>>> min
10

Мне кажется, что любой более или менее правильно настроенный линтер кода сразу скажет переписать этот ужас.
Одумайтесь! Этот код потом читать людям, а не машинам.

Я не переживаю. Скорее не так: я не переживаю за себя, я переживаю за ребят, которые спустя несколько месяцев в поиске впишут тернарный оператор, зайдут в статью, не увидят «1 апреля» и подумают, что так нужно писать код.
Я не против юмора, но хотя бы пометку в тексте...

Ну, те кто учат язык программирования по стэковерфлоу и рандомным статьям на хабре (и даже не читают камменты) — сами себе злобные буратины, как мне кажется.

Мне кажется, что как раз задача опытных разработчиков — направить таких ребят в нужное русло и, по возможности, максимально отгородить от «ненужных» источников информации.

В этой конструкции меня напрягает то, что мы получаем второе значение из кортежа если условие соблюдается. Что контринтуитивно на мой взгляд.

Вариант с true-false это частный случай, более правильный это большее количество вариантов и полноценное целое число в качестве "ключа". Ну а если вместо кортежа взять словарь, то получится switch-case в стиле питона.

Вообще говоря, очень крутая штука. Если надо будет обфусцировать код — обязательно ей воспользуюсь)
Только полноправные пользователи могут оставлять комментарии. , пожалуйста.