Я переношу синтаксический анализатор формул в стиле 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 можно найти здесь.
and
иor
в качестве условного выражения бедняка (теперь у Python есть правильное условное выражение, и приведенное выше действительно должно быть записано какself.items[-1] if self.items else None
). - person Martijn Pieters   schedule 13.07.2015self.items
, если оно доступно, илиNone
, если нет.self.items and self.items[-1] or None
тоже подойдет, за исключением того, чтоself.items[-1]
является ложным значением y, таким как0
или''
, что автор пытался обойти с помощью всего танца списков. - person Martijn Pieters   schedule 13.07.2015and
..or
хак может привести к неправильным результатам без дальнейшего возни. Их версия дает правильные результаты, но нечитаема и излишне многословна. Версия в моем первом комментарии идиоматична для Python и работает правильно. - person Martijn Pieters   schedule 13.07.2015