Stop iterating early and don't build a list to make it a bit more optimized.
Though I'm unsure if anyone is really using `unpack_non_aggregate_inverses`
cc @Andrej730 we need this for validate.buildingsmart.org because for express rule evaluation we depend on include_id=False and entity_instance.__eq__ has been changed to get_info_2.
Example of the error:
Traceback (most recent call last):
File "\test.py", line 133, in <module>
ifc_file = ifcopenshell.file.from_string(ifc_str)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "\ifcopenshell\file.py", line 648, in from_string
return file(ifcopenshell_wrapper.read(s))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "\ifcopenshell\file.py", line 264, in __init__
raise exc(msg)
ifcopenshell.SchemaError: Unsupported schema: IFC2X3
Exception ignored in: <function file.__del__ at 0x00000250896EB740>
Traceback (most recent call last):
File "\ifcopenshell\file.py", line 282, in __del__
del file_dict[self.file_pointer()]
^^^^^^^^^^^^^^^^^
File "\ifcopenshell\file.py", line 424, in __getattr__
return getattr(self.wrapped_data, attr)
^^^^^^^^^^^^^^^^^
File "\ifcopenshell\file.py", line 424, in __getattr__
return getattr(self.wrapped_data, attr)
^^^^^^^^^^^^^^^^^
File "\ifcopenshell\file.py", line 424, in __getattr__
return getattr(self.wrapped_data, attr)
^^^^^^^^^^^^^^^^^
[Previous line repeated 996 more times]
RecursionError: maximum recursion depth exceeded
Simple way to trigger those recursions was:
import ifcopenshell
ifcopenshell.file(schema="IFC4x3_RC4_43c3555")
ifcopenshell.entity_instance(("IFC4X3", "IfcPresentationStyleAssignment"))
TypeError is more correct since error occurs when user is trying to set some attribute value with None while atttribute doesn't support None type. ValueError is typically raised when provided value has a correct type but unsupported value.
Sphinx autoapi also now only shows subpackages 1 level deep. This prevents us having a huge long list. Also don't show private or special members. Also show imported members so ifcopenshell.file and ifcopenshell.entity_instance works in docs too.
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'
```