Комментарии 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"]()
Я не спец в Python
, но выглядит это как кортеж на два элемента и приложенный к нему индексатор. Предполагая, что True
это 1
, а False
это 0
.
Как уже написано выше, при создаии кортежа, скорее всего, выполнятся оба выражения, из-за чего все преимущество тернарного оператора теряется.
это как кортеж на два элемента и приложенный к нему индексатор
так и есть
Можно написать
(lambda: false_clause, lambda: true_clause)[condition]()
, но это расточительно даже по меркам Python.
Предполагая, что True это 1, а False это 0.
Это не "предполагая", а приведение типов.
Логического к целому.
В чем преимущество данной конструкции?
Мне кажется, что любой более или менее правильно настроенный линтер кода сразу скажет переписать этот ужас.
Одумайтесь! Этот код потом читать людям, а не машинам.
Первое апреля же на дворе (было), не переживайте.
Я не переживаю. Скорее не так: я не переживаю за себя, я переживаю за ребят, которые спустя несколько месяцев в поиске впишут тернарный оператор, зайдут в статью, не увидят «1 апреля» и подумают, что так нужно писать код.
Я не против юмора, но хотя бы пометку в тексте...
Ну, те кто учат язык программирования по стэковерфлоу и рандомным статьям на хабре (и даже не читают камменты) — сами себе злобные буратины, как мне кажется.
Вариант с true-false это частный случай, более правильный это большее количество вариантов и полноценное целое число в качестве "ключа". Ну а если вместо кортежа взять словарь, то получится switch-case в стиле питона.
Альтернативная форма тернарного оператора Python