Это то же самое, что и ответ Эли Барзилай, за исключением того, что вместо того, чтобы заключить его в лямбду, я заключаю его в список из 1 элемента
(if test conseq altern) => (car (or (and test (list conseq)) (list altern)))
Кстати, в Python до 2.5 была именно эта проблема. Не было хорошего способа написать условное выражение (то есть test ? conseq : altern
в C, что и есть if
в Scheme) в Python. Самая простая попытка была
test and conseq or altern
, который работал в большинстве случаев, но потерпел неудачу, когда conseq
считается ложным в Python (то есть False, 0, пустой список, пустая строка и т. Д.). Какую именно проблему вы обнаружили выше. Исправление состояло в том, чтобы обернуть его в список (непустые списки всегда верны) и извлечь его снова:
(test and [conseq] or [altern])[0]
что выглядит ужасно. Вот почему они добавили синтаксис conseq if test else altern
в Python 2.5.