Ошибка типа: конец должен быть None или строкой, а не прерыванием клавиатуры

#python #runtime-error #keyboardinterrupt

Вопрос:

если я нажму CTRL C, это приведет к ошибкам TypeError: end must be None or a string, not KeyboardInterrupt
Почему?

Код:

 import sys
def erroring(a,b,c):
  print(end=b)
sys.excepthook = erroring
while 1:pass
 

Комментарии:

1. b является объектом исключения, который нельзя использовать в качестве end= аргумента print() .

Ответ №1:

sys.excepthook должна быть функция, которая принимает три аргумента: тип, сам объект исключения и обратную трассировку.

Как сказал Джон Гордон в комментариях b , второй аргумент будет содержать само исключение. Причина , по которой он говорит TypeError: end must be None or a string, not KeyboardInterrupt , заключается в том, что есть ошибка типа, потому end что должно быть None или введите str , и вы даете ему KeyboardInterrupt . Это помогает прочитать исключения, потому что они обычно сообщают вам о проблеме.

Я хотел бы подробнее остановиться на его комментарии, хотя в противном случае не было бы смысла публиковать ответ — вы, как правило, не должны его использовать print(end = message) . Используйте print(message, end = "") — у меня нет источника, который говорит, что это лучше, но а) сообщение — это то, что вы печатаете, и end оно предназначено для того, чтобы быть терминатором/разделителем по умолчанию для новой строки, которая проходит между содержимым, а не самим содержимым. б) как вы видите здесь end , в отличие от print функции в целом , не может принимать какой-либо объект. Вы можете print(x) использовать для любого x , даже если это не строка, но вы не можете использовать end = x для не-строк.

Итак, простой способ исправить это -:

 def erroring(a, b, c):
    print(b, end = "")
 

(В любом случае, зачем тебе это нужно end = "" ? Кроме того, что именно вы пытаетесь сделать?)