Как получить доступ к элементам словаря в python, где ключи - байты, а не строки - PullRequest
2 голосов
/ 20 июня 2020

Извините, если это слишком новаторский вопрос.

У меня есть словарь, в котором ключи - байты (например, b'access_token'), а не строки.

{
 b'access_token': [b'b64ssscba8c5359bac7e88cf5894bc7922xxx'], 
 b'token_type': [b'bearer']
}

обычно я обращаюсь к элементам словаря по data_dict.get('key'), но в этом случае я получал NoneType вместо фактического значения.

Как мне получить к ним доступ или Есть ли способ преобразовать этот диктатор с байтовым ключом в строковый диктатор?

РЕДАКТИРОВАТЬ: На самом деле я получаю этот диктант при разборе такой строки запроса access_token=absdhasd&scope=abc на urllib.parse.parse_qs(string)

Ответы [ 3 ]

2 голосов
/ 20 июня 2020

Скорее всего, вы делаете какую-то глупую ошибку. В моих тестах он работает нормально.
Возможно, вы забыли добавить префикс b при попытке индексировать словарь

d={
 b'key1': [b'val1'], 
 b'key2': [b'val2']
}

d[b'key1']     # --> returns [b'val1']
d.get(b'key2') # --> returns [b'val2']
2 голосов
/ 20 июня 2020

Возможно, это то, что вы ищете?

dict = {
    b'access_token': [b'b64ssscba8c5359bac7e88cf5894bc7922xxx'], 
    b'token_type': [b'bearer']
}
print(dict.get( b'access_token'))
2 голосов
/ 20 июня 2020

Вы можете использовать str.encode() и bytes.decode() для переключения между ними (необязательно, предоставляя аргумент, определяющий кодировку. 'UTF-8' по умолчанию). В результате вы можете взять свой dict:

my_dict = {
 b'access_token': [b'b64ssscba8c5359bac7e88cf5894bc7922xxx'], 
 b'token_type': [b'bearer']
}

и просто понять, чтобы поменять местами все ключи:

new_dict = {k.decode(): v for k,v in my_dict.items()}
# {
#   'access_token': [b'b64ssscba8c5359bac7e88cf5894bc7922xxx'], 
#   'token_type': [b'bearer']
# }

Точно так же вы можете просто использовать .encode() при доступе к dict для получения байтового объекта из вашей строки:

my_key = 'access_token'
my_value = my_dict[my_key.encode()]
# [b'b64ssscba8c5359bac7e88cf5894bc7922xxx']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...