Skip to content

Instantly share code, notes, and snippets.

@meadsteve
Forked from henriklindgren/deserialize_pydantic.py
Last active August 1, 2019 14:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save meadsteve/2f720bc3a6ca9f1166ec3d1f3ed14ed8 to your computer and use it in GitHub Desktop.
Save meadsteve/2f720bc3a6ca9f1166ec3d1f3ed14ed8 to your computer and use it in GitHub Desktop.
Unpack dict based on pydantic BaseModel into model
#This is free and unencumbered software released into the public domain.
#
#Anyone is free to copy, modify, publish, use, compile, sell, or
#distribute this software, either in source code form or as a compiled
#binary, for any purpose, commercial or non-commercial, and by any
#means.
#
#In jurisdictions that recognize copyright laws, the author or authors
#of this software dedicate any and all copyright interest in the
#software to the public domain. We make this dedication for the benefit
#of the public at large and to the detriment of our heirs and
#successors. We intend this dedication to be an overt act of
#relinquishment in perpetuity of all present and future rights to this
#software under copyright law.
#
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
#EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
#MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
#IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
#OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
#ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
#OTHER DEALINGS IN THE SOFTWARE.
#
#For more information, please refer to <http://unlicense.org/>
from pydantic import BaseModel
from typing import Optional, Type, TypeVar
Model = TypeVar("Model", bound=BaseModel)
def _load_model(t: Type[Model], o: dict) -> Model:
populated_keys = o.keys()
required_keys = set(t.schema()['required'])
missing_keys = required_keys.difference(populated_keys)
if missing_keys:
raise ValueError(f'Required keys missing: {missing_keys}')
all_definition_keys = t.schema()['properties'].keys()
return t(**{k: v for k, v in o.items() if k in all_definition_keys})
if __name__ == '__main__':
class Car(BaseModel):
year: Optional[int]
name: str
company: str
car_dict = {'name': 'Uncivic', 'company': 'Fonda'}
car = _load_model(Car, car_dict)
print(car)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment