msvcrt.getch() возвращает b'a'вместо'a'?
У меня есть следующий код из одного класса:
class _Getch:
def __init__(self):
self.impl = _GetchWindows()
def read_key(self):
return self.impl()
class _GetchWindows:
def __init__(self):
import msvcrt
def __call__(self):
import msvcrt
return msvcrt.getch()
А потом у меня есть другой класс, который импортировал _Getch. В этом другом классе я пытался использовать read_key, предоставляемый _Getch, для выполнения условий в условных выражениях:
r = _Getch()
key = r.read_key()
print(key)
if key = 'a':
#do things
elif key = 's':
# do other things
else:
continue
Когда я попытался ввести "а", я ожидал, что ключ будет "а", но вместо этого он вернул b'a. Таким образом, ключ не будет выполнять ни одно из условий, и всегда будет продолжать. Почему это вернулось? Что я могу сделать, чтобы он возвратил "а" вместо этого?
1 ответ
Согласно документации, msvcrt.getch()
возвращает байтовую строку.
Так что вам нужно будет использовать bytes.decode()
метод, чтобы превратить его в строку Unicode. Подсказка: если вы сделаете это, вы должны найти кодировку вашей среды и использовать ее вместо значения по умолчанию utf-8
, Или вы можете использовать errors='replace'
,
Или вы можете изменить свой код для сравнения с b'a'
вместо.
NB: в вашем коде есть синтаксическая ошибка; ты должен использовать ==
(оператор сравнения) в вашем if
заявление вместо =
(Назначить).
Простой подход - связать вызов декодирования после getch():
import msvcrt
key = msvcrt.getch().decode('ASCII')
# 'key' now contains the ASCII representation of the input suited for easy comparison
if key == 'a':
# do a thing
elif key == 's':
# do another thing
См. Справочный ответ