Лучшая практика Python для преобразования строки в словарь

Python внешний интерфейс
Лучшая практика Python для преобразования строки в словарь

В нашей работе мы часто сталкиваемся с проблемой взаимного преобразования между типами данных, и обычно мы запрашиваем какие-то отговорки API, чтобы вернуть строку, но формат Json, и проще всего преобразовать ее в словарь на Python, поэтому Вот три способа преобразования строк в словари в Python.

Способ 1: Через встроенную функциюeval

Source Code:

#!/usr/bin/env python3
#Author: nock.chen

str_info = "{'name': 'nock', 'age': 14}"
dict_info = eval(str_info)

print("string info type is -->: %s" % (type(str_info)))
print("dict info type is -->: %s" % (type(dict_info)))

Result:

string info type is -->: <class 'str'>
dict info type is -->: <class 'dict'>

Однако при использовании eval возникает проблема безопасности, например:

Source Code:

#!/usr/bin/env python3
#Author: nock.chen

str_info = input('input str info: ')
dict_info = eval(str_info)

print("dict_info is >%s< " % dict_info)

Result:

input str info: __import__('os').system('ls')
collector_data.py
test.py
Download
dict_info is >0< 

Как показано выше, когда мы вводим__import__('os').system('ls')распечатает файлы в каталоге, где хранится скрипт, если вы передадитеrm -rf *Команды, подобные этой, удалят все вещи в измененном каталоге; конечно, сценарии, которые мы используем, будут очень хорошими и немногочисленными, и невозможно, чтобы кто-то передал такое значение, но вот объяснение.

Способ 2: пройтиjsonобработка модулей

Source Code:

#!/usr/bin/env python3
#Author: nock.chen

import json

str_info = '{"name": "nock", "age": 18}'
dict_info = json.loads(str_info)

print("string info type is -->: %s" % (type(str_info)))
print("dict info type is -->: %s" % (type(dict_info)))

Result:

string info type is -->: <class 'str'>
dict info type is -->: <class 'dict'>

использоватьjsonМодуль конвертации тоже проблема, т.к.jsonСинтаксис предусматривает, что строки в массиве или объекте должны заключаться в двойные, а не в одинарные кавычки.Официальный сайтВыше есть описание:

сообщить об ошибкеПримеры следующие:

#!/usr/bin/env python3
#Author: nock.chen

import json
str_info = "{'name': 'nock', 'age': 18}"
dict_info = json.loads(str_info)

сообщить об ошибкеРезультаты приведены ниже:

Traceback (most recent call last):
  File "test.py", line 7, in <module>
    dict_info = json.loads(str_info)
  File "/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/__init__.py", line 319, in loads
    return _default_decoder.decode(s)
  File "/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/decoder.py", line 339, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/decoder.py", line 355, in raw_decode
    obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

Метод 3: пройтиastобработка модулей

Source Code:

#!/usr/bin/env python3
#Author: nock.chen

import ast
str_info = '{"name": "nock", "age": 18}'
dict_info = ast.literal_eval(str_info)

print("string info type is -->: %s" % (type(str_info)))
print("dict info type is -->: %s" % (type(dict_info)))

s_info = "{'name': 'nock', 'age': 18}"
d_info = ast.literal_eval(s_info)

print("s info type is -->: %s" % (type(s_info)))
print("d info type is -->: %s" % (type(d_info)))

Result:

string info type is -->: <class 'str'>
dict info type is -->: <class 'dict'>
s info type is -->: <class 'str'>
d info type is -->: <class 'dict'>

использоватьast.literal_evalДля преобразования ни один из них не используетсяjsonПроблема конвертации модуля, толку нетevalПроблема безопасности преобразования модулей, поэтому рекомендуется использоватьast.literal_evalМетоды.