Маленький секрет преобразования строки Python в словарь

Python

источник

Требования передаются на фронтенднитьпревратиться вСловарь, серверная часть (Python) использует этот словарь кактело параметразапросить любой интерфейс.

Метод, используемый автором, заключается в использованииjsonв упаковкеloadsфункция, например:

import json

if __name__ == '__main__':
    test_str = '{"status": "ok"}'
    test_json = json.loads(test_str)
    print('type -----------> %s' % type(test_json))
    print('test_json -----------> %s' % test_json)

После запуска вывод консоли выглядит следующим образом:

type -----------> <class 'dict'>
test_json -----------> {'status': 'ok'}

Process finished with exit code 0

Видно, что на выходе ничего страшного, но кактщательный, обдумав сценарий бизнес-приложения, решил проверить,целое число,Плавать,вложенные словари,множество,Логическое значение,нулевойуспешно преобразован.

Что касаетсякортежа такжетип датыПросто отпусти его :)

процесс исследования

Исследуйте код:

import json

if __name__ == '__main__':
    # 整数+浮点+嵌套字典+数组 测试
    test_str = '{"status": {"number": 123, "float": 123.321, "list": [1,2,3, "1"]}}'
    test_json = json.loads(test_str)
    print('type -----------> %s' % type(test_json))
    print('test_json -----------> %s' % test_json)

Вывод консоли:

    type -----------> <class 'dict'>
    test_json -----------> {'status': {'number': 123, 'float': 123.321, 'list': [1, 2, 3, '1']}}
    
    Process finished with exit code 0

Ну ничего плохого пока нет.

Однако

Шок! удивительное открытие

Основной код:

import json

if __name__ == '__main__':
    # 布尔值+空值 测试
    test_str = '{"status1": true, "status2": false, "status3": null}'
    test_json = json.loads(test_str)
    print('type -----------> %s' % type(test_json))
    print('test_json -----------> %s' % test_json)

Вывод консоли:

type -----------> <class 'dict'>
test_json -----------> {'status1': True, 'status2': False, 'status3': None}

Process finished with exit code 0

Я полагаю, что проницательные читатели обнаружили, что,json.loadsФункция может преобразоватьtrue,false, nullуспешно трансформировался вTrue,False, None.

Поиск авторjson.loadsисходный код функции(Ctrl + B был нажат плохо)После этого я нашел этот кусок кода:

    elif nextchar == 'n' and string[idx:idx + 4] == 'null':
        return None, idx + 4
    elif nextchar == 't' and string[idx:idx + 4] == 'true':
        return True, idx + 4
    elif nextchar == 'f' and string[idx:idx + 5] == 'false':
        return False, idx + 5

этот, этот код,действительно жесткий.

Прокрутите вниз, чтобы увидеть сюрприз:

    elif nextchar == 'N' and string[idx:idx + 3] == 'NaN':
        return parse_constant('NaN'), idx + 3
    elif nextchar == 'I' and string[idx:idx + 8] == 'Infinity':
        return parse_constant('Infinity'), idx + 8
    elif nextchar == '-' and string[idx:idx + 9] == '-Infinity':
        return parse_constant('-Infinity'), idx + 9

Суммировать

за каждым фрагментом кодамаленький секретАккуратно копая, вы получите разное удовольствие и урожай.

так называемыйРазвитие через блог, разработан только в лучшую сторонупишу !

Приветствую всех, чтобы отсканировать код и подписаться на мою официальную учетную запись «Интеллектуальное автоматизированное тестирование», ответьте:Учебник по расширенному тестированию, вы можете получить его бесплатноРасширенный учебник ~

Желаю всем счастливой жизни и чтобы все было хорошо~

                                                                                                    --泰斯特
                                                                                                    2019-5-24