Пренасям анализатор на формули в стил 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 може да бъде намерено тук.
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]
е false-y стойност като0
или''
, което авторът се опита да заобиколи с целия танц на списъци. - person Martijn Pieters   schedule 13.07.2015and
..or
може да доведе до неправилни резултати без такива допълнителни бъркотии. Тяхната версия дава правилни резултати, но е нечетлива и ненужно многословна. Версията в първия ми коментар е идиоматичен Python и работи правилно. - person Martijn Pieters   schedule 13.07.2015