Поскольку *
должен применяться ко всему выражению, которое генерирует набор аргументов, а не его часть и не является условно. Внутренне, 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='')
, который гарантирует, что вся троица оценивается как неупакованная последовательность и распаковывает все, что выживает безоговорочно, избегая путаницы.