Преобразование сложного строкового представления списка (содержащего кортежи, похожие на вызовы функций) в список.Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Преобразование сложного строкового представления списка (содержащего кортежи, похожие на вызовы функций) в список.

Сообщение Anonymous »

Я пытаюсь создать приспособление для модульного тестирования. Я получаю данные из 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»