Помеченное выражение в тернарном операторе python - PullRequest
0 голосов
/ 11 января 2019

Я написал программу на python для вывода значения ascii до каждых 3 чисел в строке или "ERROR", если длина не делится на три. Я был гольф-кодом, когда наткнулся на SyntaxError.

Код:

c=input()
p=len(c)
c=[int(c[i:i+3])for i in range(0,len(c),3)]
print("ERROR"if p%3else*map(chr,c),sep='')#SyntaxError here

Но это работает:

c=input()
p=len(c)
c=[int(c[i:i+3])for i in range(0,len(c),3)]
print(*map(chr,c),sep='')

Помещение пробела перед * или после 3 не работает. Я мог бы просто использовать ''.join, но это на один символ длиннее. Мой вопрос: почему я не могу использовать помеченное звездой выражение в троичном операторе?

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Поскольку * должен применяться ко всему выражению, которое генерирует набор аргументов, а не его часть и не является условно. Внутренне, CPython использует разные байт-коды для вызовов с распаковкой по сравнению с обычными вызовами, поэтому ваше условное требование потребует, чтобы он изменил байт-код на вызов print, основываясь на аргументах, на print, по существу переписав то, что вы написали в псевдокод, например:

if p % 3:
    call(print, "ERROR", sep='')
else:
    call_varargs(print, *map(chr, c), sep='')

, что выше возможностей компилятора.

Если вы хотите сделать эту работу, вы можете сделать следующее:

print(*(("ERROR",) if p%3 else map(chr,c)), sep='')

, который гарантирует, что вся троица оценивается как неупакованная последовательность и распаковывает все, что выживает безоговорочно, избегая путаницы.

0 голосов
/ 11 января 2019
print(*(["ERROR"] if p%3 else map(chr,c)),sep="!")

храните его вне троичной

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...