Какво е 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. Щях да се опитам буквално да преведа възможно най-голяма част от кода и след това да отстраня грешки по-късно, но тъй като авторът сметна, че е достатъчно важен, за да оправдае коментара, чувствам, че трябва да проуча това, преди да напиша нещо.

Знам какво представлява троичният оператор и знам, че е наречено опасно използването на горните оператори over 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] е false-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