Python/Pydantic – использование списка с объектами jsonPython

Программы на Python
Ответить
Anonymous
 Python/Pydantic – использование списка с объектами json

Сообщение Anonymous »

У меня есть рабочая модель для получения набора данных json с помощью pydantic. Набор данных модели выглядит следующим образом:

data = {'thing_number': 123,
'thing_description': 'duck',
'thing_amount': 4.56}


Я хотел бы иметь список файлов json в качестве набора данных и иметь возможность проверять их. В конечном итоге список будет преобразован в записи в pandas для дальнейшей обработки. Моя цель — проверить произвольно длинный список записей json, который выглядит примерно так:

bigger_data = [{'thing_number': 123,
'thing_description': 'duck',
'thing_amount': 4.56},
{'thing_number': 456,
'thing_description': 'cow',
'thing_amount': 7.89}]


Базовая настройка у меня сейчас следующая. Обратите внимание, что добавление класса ItemList является частью попытки заставить работать произвольную длину.

from typing import List
from pydantic import BaseModel
from pydantic.schema import schema
import json

class Item(BaseModel):
thing_number: int
thing_description: str
thing_amount: float

class ItemList(BaseModel):
each_item: List[Item]


Базовый код затем создаст то, что я думаю, я ищу в объекте массива, который будет принимать объекты Item.

item_schema = schema([ItemList])
print(json.dumps(item_schema, indent=2))

{
"definitions": {
"Item": {
"title": "Item",
"type": "object",
"properties": {
"thing_number": {
"title": "Thing_Number",
"type": "integer"
},
"thing_description": {
"title": "Thing_Description",
"type": "string"
},
"thing_amount": {
"title": "Thing_Amount",
"type": "number"
}
},
"required": [
"thing_number",
"thing_description",
"thing_amount"
]
},
"ItemList": {
"title": "ItemList",
"type": "object",
"properties": {
"each_item": {
"title": "Each_Item",
"type": "array",
"items": {
"$ref": "#/definitions/Item"
}
}
},
"required": [
"each_item"
]
}
}
}


Настройка работает с одним передаваемым элементом json:

item = Item(**data)

print(item)

Item thing_number=123 thing_description='duck' thing_amount=4.56


Но когда я пытаюсь передать один элемент в модель ItemList, он возвращает ошибку:

item_list = ItemList(**data)

---------------------------------------------------------------------------
ValidationError Traceback (most recent call last)
in
----> 1 item_list = ItemList(**data)

/opt/conda/lib/python3.7/site-packages/pydantic/main.cpython-37m-x86_64-linux-gnu.so in pydantic.main.BaseModel.__init__()

/opt/conda/lib/python3.7/site-packages/pydantic/main.cpython-37m-x86_64-linux-gnu.so in pydantic.main.validate_model()

ValidationError: 1 validation error for ItemList
each_item
field required (type=value_error.missing)


Я также пробовал передать big_data в массив, думая, что он должен начинаться со списка. это также возвращает ошибку - - Хотя я, по крайней мере, лучше понимаю словарную ошибку и не могу понять, как ее устранить.

item_list2 = ItemList(**data_big)

---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
in
----> 1 item_list2 = ItemList(**data_big)

TypeError: MetaModel object argument after ** must be a mapping, not list


Спасибо.

Другие вещи, которые я пробовал
Я попробовал передать данные в конкретный ключ, но повезло больше (может быть?).

item_list2 = ItemList(each_item=data_big)

---------------------------------------------------------------------------
ValidationError Traceback (most recent call last)
in
----> 1 item_list2 = ItemList(each_item=data_big)

/opt/conda/lib/python3.7/site-packages/pydantic/main.cpython-37m-x86_64-linux-gnu.so in pydantic.main.BaseModel.__init__()

/opt/conda/lib/python3.7/site-packages/pydantic/main.cpython-37m-x86_64-linux-gnu.so in pydantic.main.validate_model()

ValidationError: 6 validation errors for ItemList
each_item -> 0 -> thing_number
field required (type=value_error.missing)
each_item -> 0 -> thing_description
field required (type=value_error.missing)
each_item -> 0 -> thing_amount
field required (type=value_error.missing)
each_item -> 1 -> thing_number
field required (type=value_error.missing)
each_item -> 1 -> thing_description
field required (type=value_error.missing)
each_item -> 1 -> thing_amount
field required (type=value_error.missing)


Подробнее здесь: https://stackoverflow.com/questions/580 ... on-objects
Ответить

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

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

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

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

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