python создание сложных объектов - PullRequest
0 голосов
/ 14 апреля 2020

Я очень новичок в python и мне нужна помощь, чтобы решить проблему ниже, пожалуйста,

Мне нужно создать python объект с именем Error и затем напечатать его в формате json: Ниже приведена ссылка к изображению структуры объекта введите описание изображения здесь

Класс данных

class Data:

    def __init__(self,fileName:str, rowId:int, rowData:str):
        self.fileName = fileName
        self.rowId= rowId
        self.rowData = rowData

    def get_fileName(self):
        return self.fileName

    def set_fileName(self, fileName):
        self.fileName = fileName

    def get_rowId(self):
        return self.rowId

    def set_rowId(self, rowId):
        self.rowId = rowId

    def get_rowData(self):
        return self.rowData

    def set_rowData(self, rowData):
        self.rowData = rowData

Класс ошибок:

from Process import Process 
from RootCause import RootCause
import json

class Errors(object):

    def __init__(self, process,rootCause):
        self.process= process
        self.rootCause= rootCause

    def get_process(self):
        return self.process

    def set_process(self, process):
        self.process = process

    def get_rootCause(self):
        return self.rootCause

    def set_rootCause(self, rootCause):
        self.rootCause = rootCause

    def __str__(self):
        return (json.dumps(self.process.get_flow))

Класс процесса -

class Process:

    def __init__(self, id:str,flow:str,flowSubType:str):
        self.id= id
        self.flow= flow
        self.flowSubType= flowSubType

    def get_id(self):
        return self.id

    def set_id(self, id):
        self.id = id

    def get_flow(self):
        return self.flow

    def set_flow(self, flow):
        self.flow = flow

    def get_flowSubType(self):
        return self.flowSubType

    def set_flowSubType(self, flowSubType):
        self.flowSubType = flowSubType

Класс RootCause -

class RootCause:

    def __init__(self,system:str, code:str,message:str,timeStamp:str):
        self.system= system
        self.code= code
        self.message= message
        self.timeStamp= timeStamp

    def get_system(self):
        return self.system

    def set_system(self, system):
        self.system = system

    def get_code(self):
        return self.code

    def set_code(self, code):
        self.code = code

    def get_message(self):
        return self.message

    def set_message(self, message):
        self.message = message

    def get_timeStamp(self):
        return self.timeStamp

    def set_timeStamp(self, timeStamp):
        self.timeStamp = timeStamp

Класс ошибок:

from Data import Data
from Errors import Errors
from Process import Process
from RootCause import RootCause
from typing import List
import json

class Error(object):
    def __init__(self,data,errors : List[Errors]):
         self.data= data
         self.errors= errors

    def get_data(self):
        return self.data

    def set_data(self, data):
        self.data=data

    def get_errors(self):
        return self.errors

    def set_errors(self, errors):
        self.errors = errors

def test():
    data = Data('a',2,'b')
    process = Process('id','flow','subtype')
    rootCause = RootCause('sys','co','message','timestamp')
    errors = [process, rootCause]
    error = Error(data,errors)
    json_data = json.dumps(error, default=lambda o: o.__dict__)
    print(json_data)

test()

После выполнения класса ошибок я получаю вывод, как показано ниже:

{
"data": 
    {
       "fileName": "a",
       "rowId": 2,
       "rowData": "b"
    },
    "errors": [
        {
         "id": "id",
         "flow": "flow", 
         "flowSubType": "subtype"
        }, 
        {
         "system": "sys",
         "code": "co",
         "message": "message",
         "timeStamp": "timesta"
        }
    ]
}

Но мне нужна помощь в печати вывода, как показано ниже:

{
    "data": {
        "fileName": "a",
        "rowId": 2,
        "rowData": "b"
    },
    "errors": [
        {
            "Process": {
                "id": "id",
                "flow": "flow",
                "flowSubType": "subtype"
            },
            "error": {
                "system": "sys",
                "code": "co",
                "message": "message",
                "timeStamp": "timestamp"
            }
        }
    ]
}

Может кто-нибудь, пожалуйста, помогите мне в этом вопросе.

1 Ответ

2 голосов
/ 14 апреля 2020

Два способа получить желаемый результат

Способ 1: сохранить ошибки в словаре, а не в списке:

class Error(object):
    def __init__(self,data,errors : List[Errors]):
         self.data= data
         self.errors= {"Process": errors[0], "errors": errors[1]}

Способ 2 (рекомендуется), написать правильный асдикт () функция (использование модели данных Python - это хорошая практика, когда это имеет смысл, но мундштук __dict__ немного сложен и должен действительно использоваться только для проверки объектов, а не для получения представления объекта в формате бизнес-случая.

class Error(object):
    def __init__(self,data,errors : List[Errors]):
         self.data= data
         self.errors= errors

    def asdict(self):
        return {
            "data": self.data.__dict__, # or you can write an asdict() on every class
            "errors": {"process": self.errors[0].__dict__, "error": self.errors[1].__dict__}
        }

Вы бы назвали это с:

d = obj.asdict()
json.dumps(d)  # will probably still need the default to handle those nested objects. unless you write asdict() methods on those too and call them above.

Относительно одного или двух других пунктов из моих комментариев:

  • In Python нам разрешен прямой доступ к атрибутам объекта, например, obj.attr.

  • Не нужны методы получения и установки.

  • Если вы не не нужно, чтобы кто-то получал доступ к переменной, добавляя подчеркивание, например self._data Это на самом деле ничего не делает, но по соглашению Python кодеры знают, что нужно оставить переменные экземпляра подчеркивания в покое или принять последствия, если они этого не делают. это как мягкая политика "приват" переменная.

  • Если в конце строки вы хотите получить геттер, который действительно что-то делает (например, конвертирует из метри c в имперские перед возвратом), очень легко добавить это в отделочные работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...