Я пытаюсь создать приспособление для модульного тестирования. Я получаю данные из API, и мне нужны данные, похожие на те, которые я получаю от API, без вызова API. Мне нужно создать несколько литералов списка, которые отражают различные сценарии модульного теста. Вот строковое представление списка, который я пытаюсь преобразовать в список:
[(3479865,
PaginatedManagedEntityHeaders(
success=True,
count=0,
rows=[
ManagedEntityHeader(
case_role='Reference',
display_name='Person A',
entity_type='PERSON',
unique_id=247878382,
is_active='1',
date_created=datetime.datetime(2021, 10, 18, 16, 29, 6, 535000, tzinfo=TzInfo(UTC))),
ManagedEntityHeader(
case_role='Reference',
display_name='Person B',
entity_type='PERSON',
unique_id=247563788,
is_active='0',
date_created=datetime.datetime(2021, 9, 8, 21, 4, 29, 631000, tzinfo=TzInfo(UTC)))]
))]
Я сохранил это как файл JSON: «test_fixture.json». Я также мог сохранить его как текстовый файл. Он успешно импортируется в виде строки. Я не думаю, что смогу создать этот список в коде Python, не получив при этом многочисленных ошибок, но, возможно, есть способ сделать это. Вот что я пытался до сих пор преобразовать строку в список.
import os
import json
import ast
import re
the_file = os.path.join(r"test_fixture.json")
file_str = open(the_file).read()
meth1 = file_str.strip("][").split(", ")
# receive a list of 25 instead of a list of 1
meth2 = ast.literal_eval(file_str)
# ValueError: malformed node or string on line 2:
meth3 = json.loads(file_str)
# JSONDecodeError: Expecting value
elements = re.findall(r"\d+", file_str)
meth4 = [int(x) for x in elements]
# receive a list of 20 instead of a list of 1
meth5 = eval(file_str)
# NameError: name 'PaginatedManagedEntityHeaders' is not defined
meth6 = list(map(int, file_str[1:-1].split(",")))
# ValueError: invalid literal for int() with base 10: '(3479865'
Есть ли другой метод (meth_that_worked), который успешно преобразует строку в список из 1 элемента?
print(meth_that_worked) должен выдавать результат, идентичный строковому представлению списка выше.
print(type(meth_that_worked)) должен создать . print(len(meth_that_worked)) должен выдать 1.
Обновление
На основе в некоторых комментариях я попытался устранить ошибки пространства имен, возникающие при выполнении eval(file_str), следующим образом:
def ManagedEntityHeader(*args, **kwargs):
pass
def TzInfo(*args, **kwargs):
pass
def UTC(*args, **kwargs):
pass
Затем я получил следующую ошибку:
ValidationError: 2 validation errors for PaginatedManagedEntityHeaders
rows.0
Input should be a valid dictionary or object to extract fields from [type=model_attributes_type, input_value=None, input_type=NoneType]
For further information visit https://errors.pydantic.dev/2.6/v/model_attributes_type
rows.1
Input should be a valid dictionary or object to extract fields from [type=model_attributes_type, input_value=None, input_type=NoneType]
For further information visit https://errors.pydantic.dev/2.6/v/model_attributes_type
Затем я создал функцию, аналогичную приведенной выше, для устранения этой ошибки:
def PaginatedManagedEntityHeaders(*args, **kwargs):
pass
После этого список был успешно создан, но его содержимое было усечено по сравнению с исходным строковым представлением списка:
[(3479865, None)]
Подробнее здесь: https://stackoverflow.com/questions/786 ... which-look
Преобразование сложного строкового представления списка (содержащего кортежи, похожие на вызовы функций) в список. ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение