diff --git a/evennia/commands/default/building.py b/evennia/commands/default/building.py index 8a5a883338..d566f29ca2 100644 --- a/evennia/commands/default/building.py +++ b/evennia/commands/default/building.py @@ -1697,15 +1697,17 @@ class CmdSetAttribute(ObjManipCommand): val = obj.attributes.get(key) deep = self.do_nested_lookup(val, *nested_keys[:-1]) if deep is not self.not_found: - del deep[del_key] + try: + del deep[del_key] + except (IndexError, KeyError, TypeError): + continue obj.attributes.add(key, val) return "\nDeleted attribute '%s' (= nested) from %s." % (attr, obj.name) else: exists = obj.attributes.has(key) obj.attributes.remove(attr) return "\nDeleted attribute '%s' (= %s) from %s." % (attr, exists, obj.name) - else: - return "\n%s has no attribute '%s'." % (obj.name, attr) + return "\n%s has no attribute '%s'." % (obj.name, attr) def set_attr(self, obj, attr, value): for key, nested_keys in self.split_nested_attr(attr): diff --git a/evennia/commands/default/tests.py b/evennia/commands/default/tests.py index 91d11bae13..ed88b4e02c 100644 --- a/evennia/commands/default/tests.py +++ b/evennia/commands/default/tests.py @@ -548,6 +548,9 @@ class TestBuilding(CommandTest): "Obj/test1[0] =", "Deleted attribute 'test1[0]' (= nested) from Obj.") self.call(building.CmdSetAttribute(), "Obj/test1[0]", "Attribute Obj/test1[0] = 2") self.call(building.CmdSetAttribute(), "Obj/test1[1]", "Obj has no attribute 'test1[1]'.") + # Delete non-existent + self.call(building.CmdSetAttribute(), + "Obj/test1[5] =", "Obj has no attribute 'test1[5]'.") # removing white space proves real parsing self.call(building.CmdSetAttribute(), @@ -567,6 +570,8 @@ class TestBuilding(CommandTest): self.call(building.CmdSetAttribute(), "Obj/test2['two']", "Obj has no attribute 'test2['two']'.") self.call(building.CmdSetAttribute(), "Obj/test2", "Attribute Obj/test2 = {'one': 99, 'three': 3}") self.call(building.CmdSetAttribute(), "Obj/test2[0]", "Obj has no attribute 'test2[0]'.") + self.call(building.CmdSetAttribute(), + "Obj/test2['five'] =", "Obj has no attribute 'test2['five']'.") # Deaper nesting self.call(building.CmdSetAttribute(),