#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 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)