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

См. Справочный ответ

Другие вопросы по тегам