#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. Я вижу, большое спасибо! 🙂 Мне очень интересно учиться, так что спасибо за объяснение 😀