Skip to content

Instantly share code, notes, and snippets.

@alexanderankin
Created August 13, 2023 14:46
Show Gist options
  • Select an option

  • Save alexanderankin/a4c4a711d8247c8d05dd1521a1011084 to your computer and use it in GitHub Desktop.

Select an option

Save alexanderankin/a4c4a711d8247c8d05dd1521a1011084 to your computer and use it in GitHub Desktop.
using vanilla python to parse azure rest api stuff to dataclasses
import dataclasses
import json
def default_dataclass_init_method(self, kwargs):
for fi in dataclasses.fields(self):
value = kwargs.get(fi.name, fi.default)
if value == dataclasses.MISSING:
if fi.default_factory == dataclasses.MISSING:
raise ValueError('missing field ' + fi.name + ' and no default/factory')
value = fi.default_factory()
setattr(self, fi.name, value)
ODATA_ = '@odata.'
def default_dataclass_odata_azure_stuff(self, kwargs):
fixed = {k[len(ODATA_):]: kwargs.pop(k) for k in list(kwargs.keys()) if k.startswith(ODATA_)}
kwargs.update(fixed)
default_dataclass_init_method(self, kwargs)
@dataclasses.dataclass
class Example:
my_field: str # = dataclasses.field(default=None)
nextLink: str = None
def __init__(self, **kwargs):
default_dataclass_odata_azure_stuff(self, kwargs)
def __post_init__(self):
print(self)
def main():
dc_input = '{"@odata.nextLink":"abc","my_field":null}'
e_input = json.loads(dc_input)
e = Example(**e_input)
print(e)
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment