Think I figured it out, UpdateNetworkDeviceModel does not behave properly.
name = dictionary.get('name')
tags = dictionary.get('tags')
lat = dictionary.get('lat')
lng = dictionary.get('lng')
address = dictionary.get('address')
notes = dictionary.get('notes')
move_map_marker = dictionary.get('moveMapMarker')
switch_profile_id = dictionary.get('switchProfileId')
floor_plan_id = dictionary.get('floorPlanId')
All possible fields are always returned and sent in the PUT. For values you did not pass, like switch_profile_id, null is returned. The API rejects a null value for this key.
Passing the parameters composed by the Python API to curl results in various errors:
{"errors":["Device's network must be bound to a configuration template (that supports switches) to allow for switch profile binding"]}
{"errors":["'moveMapMarker' must be a boolean"]}
So TL;DR the underlying UpdateNetworkDeviceModel has to be updated with additional logic to not send invalid values when they're not set.