- if isinstance(descriptor, str):
- descriptor = self._parse(descriptor, descriptor_format)
- elif descriptor:
- pass
- else:
- descriptor = {}
-
- if item not in self.client_to_RO:
- raise ROClientException("Invalid item {}".format(item))
- desc, enveloped = remove_envelop(item, descriptor)
-
- # Override descriptor with kwargs
- if kwargs:
- try:
- for k, v in kwargs.items():
- update_content = desc
- kitem_old = None
- klist = k.split(".")
- for kitem in klist:
- if kitem_old is not None:
- update_content = update_content[kitem_old]
- if isinstance(update_content, dict):
- kitem_old = kitem
- elif isinstance(update_content, list):
- kitem_old = int(kitem)
+ try:
+ if isinstance(descriptor, str):
+ descriptor = self._parse(descriptor, descriptor_format)
+ elif descriptor:
+ pass
+ else:
+ descriptor = {}
+
+ if item not in self.client_to_RO:
+ raise ROClientException("Invalid item {}".format(item))
+ desc, enveloped = remove_envelop(item, descriptor)
+
+ # Override descriptor with kwargs
+ if kwargs:
+ desc = deepcopy(desc) # do not modify original descriptor
+ try:
+ for k, v in kwargs.items():
+ update_content = desc
+ kitem_old = None
+ klist = k.split(".")
+ for kitem in klist:
+ if kitem_old is not None:
+ update_content = update_content[kitem_old]
+ if isinstance(update_content, dict):
+ kitem_old = kitem
+ elif isinstance(update_content, list):
+ kitem_old = int(kitem)
+ else:
+ raise ROClientException(
+ "Invalid query string '{}'. Descriptor is not a list nor dict at '{}'".format(k, kitem))
+ if v == "__DELETE__":
+ del update_content[kitem_old]