Что такое Python и/или хак и как его можно эмулировать в Go?

Я переношу синтаксический анализатор формул в стиле Excel с Python на Go и наткнулся на этот комментарий в определении функции стека токенов:

def token(self):
        # Note: this uses Pythons and/or "hack" to emulate C's ternary operator (i.e. cond ? exp1 : exp2)
        return ((len(self.items) > 0) and [self.items[len(self.items) - 1]] or [None])[0]

Я не совсем уверен, каковы последствия этого, имея лишь ограниченный опыт работы с Python. Я собирался попытаться буквально перевести как можно больше кода, а затем отладить позже, но, поскольку автор счел это достаточно важным, чтобы оправдать комментарий, я чувствую, что должен изучить это, прежде чем что-либо писать.

Я знаю, что такое тернарный оператор, и я знаю, что использовать приведенные выше операторы вместо if в Python называют небезопасным, но я думаю, что его оставили, чтобы использовать это. Может ли кто-нибудь, кто лучше разбирается в Python, объяснить мне, почему кто-то использует этот так называемый хак вместо рекомендуемого, чтобы я знал, как подражать его поведению?

Полное решение Python можно найти здесь.


person leylandski    schedule 13.07.2015    source источник
comment
Для этого конкретного примера автор использовал and и or в качестве условного выражения бедняка (теперь у Python есть правильное условное выражение, и приведенное выше действительно должно быть записано как self.items[-1] if self.items else None).   -  person Martijn Pieters    schedule 13.07.2015
comment
Однако качество этого фрагмента кода в целом ужасное, даже без условного выражения. Он возвращает последнее значение self.items, если оно доступно, или None, если нет. self.items and self.items[-1] or None тоже подойдет, за исключением того, что self.items[-1] является ложным значением y, таким как 0 или '', что автор пытался обойти с помощью всего танца списков.   -  person Martijn Pieters    schedule 13.07.2015
comment
Так что мне не нужно беспокоиться о том, что этот «хак» может дать неправильные результаты при определенных условиях, если его намеренно оставили, потому что это то, что задумал автор?   -  person leylandski    schedule 13.07.2015
comment
Автор взломал хак, потому что and..or хак может привести к неправильным результатам без дальнейшего возни. Их версия дает правильные результаты, но нечитаема и излишне многословна. Версия в моем первом комментарии идиоматична для Python и работает правильно.   -  person Martijn Pieters    schedule 13.07.2015
comment
Также см. Есть ли в Python тернарный условный оператор?   -  person Martijn Pieters    schedule 13.07.2015