Вопрос Python о получении данных из списка

#python #json #validation #pipeline

Вопрос:

Мой Python не очень хорош, и я хотел бы посмотреть, имеет ли смысл мой код или как я могу его улучшить 🙂

Таким образом, некоторые данные поступают из API, конвейер передает эти данные в Postgres с помощью Python. Я не создавал код, но меня попросили расширить его новыми полями.

Это образец JSON:

  "hs_lead_status": {
        "value": "Closure - Successful - Re-Employment",
        "versions": [
            {
                "value": "Closure - Successful - Re-Employment",
                "source-type": "CRM_UI",
                "source-id": "userId:10939396",
                "source-label": null,
                "updated-by-user-id": 10939396,
                "timestamp": 1632381167439,
                "selected": false
            },
            {
                "value": "(CH)_Court_Order_Filed_Advocard",
                "source-type": "CRM_UI",
                "source-id": "userId:10939396",
                "source-label": null,
                "updated-by-user-id": 10939396,
                "timestamp": 1616073472239,
                "selected": false
            },
            {
                "value": "HANDOVER_TO_ADVOCATE",
                "source-type": "CRM_UI",
                "source-id": "userId:10939396",
                "source-label": null,
                "updated-by-user-id": 10939396,
                "timestamp": 1616073465338,
                "selected": false
            },
            {
                "value": "(CH)_Court_Order_Filed_Advocard",
                "source-type": "CRM_UI",
                "source-id": "userId:10939396",
                "source-label": null,
                "updated-by-user-id": 10939396,
                "timestamp": 1616073380530,
                "selected": false
            },
            {
                "value": "HANDOVER_TO_ADVOCATE",
                "source-type": "CRM_UI",
                "source-id": "userId:10939396",
                "source-label": null,
                "updated-by-user-id": 10939396,
                "timestamp": 1616073375133,
                "selected": false
            },
            {
                "value": "(CH)_Court_Order_Filed_Advocard",
                "source-type": "CRM_UI",
                "source-id": "userId:10939396",
                "source-label": null,
                "updated-by-user-id": 10939396,
                "timestamp": 1616073225645,
                "selected": false
            },
            {
                "value": "HANDOVER_TO_ADVOCATE",
                "source-type": "CRM_UI",
                "source-id": "userId:10939396",
                "source-label": null,
                "updated-by-user-id": 10939396,
                "timestamp": 1616073219779,
                "selected": false
            },
            {
                "value": "(CH)_Court_Order_Filed_Advocard",
                "source-type": "CRM_UI",
                "source-id": "userId:10939396",
                "source-label": null,
                "updated-by-user-id": 10939396,
                "timestamp": 1609861682503,
                "selected": false
            },
            {
                "value": "HANDOVER_TO_ADVOCATE",
                "source-type": "CRM_UI",
                "source-id": "userId:12769108",
                "source-label": null,
                "updated-by-user-id": 12769108,
                "timestamp": 1608626160658,
                "selected": false
            }
        ]
    }
 

Мне нужно получить значение из «hs_lead_status» —> «Версии»:[«Метка времени»(только самая ранняя метка времени)] , где versions.value == «HANDOVER_TO_ADVOCATE»

Это код, который я создал, я не уверен, имеет ли это смысл или нет, когда я запускаю код в своем локальном компьютере, он не дает сбоев, но я не получаю ответ, так что

 hs_lead_info = data['hs_lead_status']

def get_hs_lead_info(field_name):
    for field in hs_lead_info or []:
        if field['versions']['value'] == "HANDOVER_TO_ADVOCATE":
            return field.get(((min('timestamp'))), '')
 

Я боюсь испортить это, и я пробую это в PROD, потому что у нас здесь нет ПОСТАНОВКИ, если вы можете дать мне какие-либо отзывы о коде, я буду признателен!

Это фрагмент всего кода для большего контекста:

 def from_dict(cls, vid, data):
    if data is None:
        return ContactsEntity()
    else:
        
        hs_lead_info = data['hs_lead_status']
        def get_hs_lead_info(field_name):
            for field in hs_lead_info or []:
                if field['versions']['value'] == "HANDOVER_TO_ADVOCATE":
                    return field.get(((min('timestamp'))), '')

        return ContactsEntity(vid=vid,
                              produkt=data.get("properties", {})
                              .get("produkt", {}).get("value", None),
                              email=data.get("properties", {})
                              .get("email", {}).get("value", None),
                              salutation=data.get("properties", {})
                              .get("salutation", {}).get("value", None),
                              name="{} {}".format(data.get("properties", {})
                                                  .get("fd_nachname", {}).get("value", ""),
                                                  data.get("properties", {}).get("fd_vorname", {})
                                                  .get("value", "")),
                              verantwortlicher_anwalt=data.get("properties", {})
                              .get("verantwortlicher_anwalt", {}).get("value", None),
                              cc_legalinsurance=data.get("properties", {})
                              .get("cc_legalinsurance", {}).get("value", None),
                              rechtsschutzversicherer=data.get("properties", {})
                              .get("rechtsschutzversicherer", {}).get("value", None),
                              fallkategorie__c=data.get("properties", {})
                              .get("fallkategorie", {}).get("value", None),
                              cc_customer_problem=data.get("properties", {})
                              .get("cc_customer_problem", {}).get("value", None),
                              selbstbeteiligung=data.get("properties", {})
                              .get("selbstbeteiligung", {}).get("value", None),
                              fd_arbeitsbeginn=data.get("properties", {}).get("fd_arbeitsbeginn", {})
                              .get("value", None),
                              cc_empnum=data.get("properties", {})
                              .get("cc_empnum", {}).get("value", None),
                              fd_mandant_anschrift_plz=data.get("properties", {})
                              .get("fd_mandant_anschrift_plz", {}).get("value", None),
                              salesforcecontactid=data.get("properties", {})
                              .get("salesforcecontactid", {}).get("value", None),
                              hs_lead_status=data.get("properties", {})
                              .get("hs_lead_status", {}).get("value" , None),
                              hand_over_advocate_date=get_hs_lead_info("timestamp"),
                              lawcus_uuid=data.get("properties", {})
                              .get("lawcus_uuid", {}).get("value", None),
                              closure_date=data.get("properties", {})
                              .get("closure_date", {}).get("value", None),
                              local_counsel_email=data.get("properties", {})
                              .get("local_counsel_email", {}).get("value", None),
                              local_counsel_name="{} {}".format(data.get("properties", {})
                                                  .get("terminsvertreter_nachname", {}).get("value", ""),
                                                  data.get("properties", {}).get("terminsvertreter_vorname", {})
                                                  .get("value", "")),
                              compensation_amount_final=data.get("properties", {})
                              .get("abfindungssumme_final", {}).get("value", None),
                              createdate=data.get("properties", {})
                              .get("createdate", {}).get("value", None),
                              mandant_familienstand=data.get("properties", {})
                              .get("mandant_familienstand", {}).get("value", None),
                              closure_verfahrensschritt=data.get("properties", {})
                              .get("closure_verfahrensschritt", {}).get("value", None),
                              sonderkuendigungsschutz=data.get("properties", {})
                              .get("sonderkuendigungsschutz", {}).get("value", None),
                              tarifvertrag=data.get("properties", {})
                              .get("tarifvertrag", {}).get("value", None),
                              fd_betriebsrat=data.get("properties", {})
                              .get("fd_betriebsrat", {}).get("value", None),
                              closure_type=data.get("properties", {})
                              .get("closure_type", {}).get("value", None),
                              mandant_geburtsdatum=data.get("properties", {})
                              .get("mandant_geburtsdatum", {}).get("value", None),
                              fd_bruttomonatsgehalt_docs=data.get("properties", {})
                              .get("fd_bruttomonatsgehalt_docs", {}).get("value", None))
 

Спасибо

Комментарии:

1. В нижнем фрагменте кода я не понимаю, почему вы сделали отступ def ниже hs_lead_info задания. Нужно ли это? Также для for field in hs_lead_info or []: того , что вы ожидаете повторить в точности?

2. привет @ZaydH да нужна как от того, что я могу видеть из кода, я хочу, чтобы перебирать "versions": [ {"value"}] и если значение = «HANDOVER_TO_ADVOCATE» я хочу, чтобы получить самый ранний timestamp для этого состояния, поскольку она может быть «HANDOVER_TO_ADVOCATE» много раз, но мы нуждаемся в первый раз он пришел, чтобы этот статус получить Би отчет.

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

Ответ №1:

Ниже приведен фрагмент кода, который вы можете протестировать. (онлайн-компилятор https://www.online-python.com/online_python_compiler)

Пожалуйста… не вставляйте в PROD без предварительного тестирования …

 import json

data = """
{"hs_lead_status": {
        "value": "Closure - Successful - Re-Employment",
        "versions": [
            {
                "value": "HANDOVER_TO_ADVOCATE",
                "source-type": "CRM_UI",
                "source-id": "userId:10939396",
                "source-label": null,
                "updated-by-user-id": 10939396,
                "timestamp": 1032381167430,
                "selected": false
            },
            {
                "value": "HANDOVER_TO_ADVOCATE",
                "source-type": "CRM_UI",
                "source-id": "userId:10939396",
                "source-label": null,
                "updated-by-user-id": 10939396,
                "timestamp": 1616073472239,
                "selected": false
            }
        ]
    }
}
"""

def get_hs_lead_info(datas):
    min = 9999999999999
    for field in datas['versions'] or []:
        if field['value'] == 'HANDOVER_TO_ADVOCATE':
            if field['timestamp'] < min:
                min = field['timestamp']
    return min

info = json.loads(data) 
print(get_hs_lead_info(info['hs_lead_status']))
 

Комментарии:

1. эй, @Zeppi, большое спасибо за это! спасибо, что дали мне инструмент для тестирования кода 🙂 один вопрос, есть функция min() и max (), почему это нельзя использовать, есть ли конкретная причина?

2. Для использования min max вам необходимо предварительно подготовить свои данные. Например, вы можете сделать вот так gist.github.com/zeppi/8327ef64eb27d05ac5f8b693f9c8f1a6

3. Я вижу, большое спасибо! 🙂 Мне очень интересно учиться, так что спасибо за объяснение 😀