mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-09 09:21:46 +00:00
More descriptive error setting non-present attributes
Example:
```
import ifcopenshell
ifc_file = ifcopenshell.file(schema="IFC2X3")
# ifc_file.begin_transaction()
wall = ifc_file.createIfcWall()
wall.Identification = "25"
# Before:
# Traceback (most recent call last):
# File "test.py", line 4, in <module>
# wall.Identification = "25"
# ^^^^^^^^^^^^^^^^^^^
# File "\ifcopenshell\entity_instance.py", line 279, in __setattr__
# self[index] = value
# ~~~~^^^^^^^
# File "\ifcopenshell\entity_instance.py", line 293, in __setitem__
# method = self.method_list[idx]
# ~~~~~~~~~~~~~~~~^^^^^
# IndexError: list index out of range
# or this (if file had a transaction going)
# File "\ifcopenshell\entity_instance.py", line 279, in __setattr__
# self[index] = value
# ~~~~^^^^^^^
# File "\ifcopenshell\entity_instance.py", line 288, in __setitem__
# self.wrapped_data.file.transaction.store_edit(self, idx, value)
# File "\ifcopenshell\file.py", line 101, in store_edit
# "old": self.serialise_value(element, element[index]),
# ~~~~~~~^^^^^^^
# File "\ifcopenshell\entity_instance.py", line 283, in __getitem__
# raise IndexError("Attribute index {} out of range for instance of type {}".format(key, self.is_a()))
# IndexError: Attribute index 4294967295 out of range for instance of type IfcWall
# After:
# Traceback (most recent call last):
# File "test.py", line 4, in <module>
# wall.Identification = "25"
# ^^^^^^^^^^^^^^^^^^^
# File "ifcopenshell\entity_instance.py", line 283, in __setattr__
# raise AttributeError(
# AttributeError: entity instance of type 'IFC2X3.IfcWall' has no attribute 'Identification'
```
This commit is contained in:
@@ -276,7 +276,15 @@ class entity_instance(object):
|
||||
|
||||
def __setattr__(self, key: str, value: Any) -> None:
|
||||
index = self.wrapped_data.get_argument_index(key)
|
||||
self[index] = value
|
||||
try:
|
||||
self[index] = value
|
||||
except IndexError as e:
|
||||
# get_argument_index returns 0xFFFFFFFF if attribute is not found
|
||||
if index == 0xFFFFFFFF:
|
||||
raise AttributeError(
|
||||
"entity instance of type '%s' has no attribute '%s'" % (self.wrapped_data.is_a(True), key)
|
||||
)
|
||||
raise e
|
||||
|
||||
def __getitem__(self, key: int) -> Any:
|
||||
if key < 0 or key >= len(self):
|
||||
|
||||
Reference in New Issue
Block a user