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 «а». Таким образом, ключ не будет выполнять ни одно из условий и всегда будет продолжаться. Почему он вернулся b'a'? Что я могу сделать, чтобы он вместо этого возвращал «а»?


person Brynhildr Xie    schedule 14.06.2015    source источник


Ответы (2)


Согласно документации, msvcrt.getch() возвращает строку байтов.

Поэтому вам нужно будет использовать метод bytes.decode(), чтобы включить его в строку юникода. Совет. Если вы сделаете это, вам следует найти кодировку вашей среды и использовать ее вместо utf-8 по умолчанию. Или вы можете использовать errors='replace'.

Или вы можете изменить свой код, чтобы вместо этого сравнить с b'a'.

Примечание: в вашем коде есть синтаксическая ошибка; вы должны использовать == (оператор сравнения) в вашем операторе if вместо = (назначить).

person Roland Smith    schedule 14.06.2015

Простой подход состоит в том, чтобы связать вызов декодирования после 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

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

person anhoppe    schedule 02.02.2020