diff --git a/src/ifcopenshell-python/ifcopenshell/file.py b/src/ifcopenshell-python/ifcopenshell/file.py index 10cc3240ef..cd161cf63c 100644 --- a/src/ifcopenshell-python/ifcopenshell/file.py +++ b/src/ifcopenshell-python/ifcopenshell/file.py @@ -898,7 +898,7 @@ class file_mixin: def _determine_schema_identifier( schema: Optional[ifcopenshell.util.schema.IFC_SCHEMA] = None, schema_version: Optional[tuple[int, int, int, int]] = None, - ): + ) -> str: if schema_version: prefixes = ("IFC", "X", "_ADD", "_TC") schema = "".join("".join(map(str, t)) if t[1] else "" for t in zip(prefixes, schema_version)) diff --git a/src/ifcopenshell-python/ifcopenshell/ifcopenshell_wrapper.pyi b/src/ifcopenshell-python/ifcopenshell/ifcopenshell_wrapper.pyi index 9b35f8b0cd..92dc5e6f01 100644 --- a/src/ifcopenshell-python/ifcopenshell/ifcopenshell_wrapper.pyi +++ b/src/ifcopenshell-python/ifcopenshell/ifcopenshell_wrapper.pyi @@ -21,6 +21,7 @@ from typing import Any, Literal, Sequence, Union from typing_extensions import Self import ifcopenshell +import ifcopenshell.util.schema from ifcopenshell.entity_instance import entity_instance_mixin from ifcopenshell.file import file_mixin @@ -830,7 +831,12 @@ class face: class file(file_mixin): def fresh_id(self) -> int: ... - def __init__(self, *args): ... + def __init__( + self, + schema: ifcopenshell.util.schema.IFC_SCHEMA | None = None, + schema_identifier: str | None = None, + schema_version: tuple[int, int, int, int] | None = None, + ): ... def _add(self, entity: entity_instance, id: int = -1) -> entity_instance: ... def add_type_ref(self, new_entity): ... def batch(self) -> None: diff --git a/src/ifcwrap/IfcParseWrapper.i b/src/ifcwrap/IfcParseWrapper.i index d80ef5c7d7..6688d2440b 100644 --- a/src/ifcwrap/IfcParseWrapper.i +++ b/src/ifcwrap/IfcParseWrapper.i @@ -38,6 +38,16 @@ %ignore ifcopenshell::file::byref_excl_; %ignore ifcopenshell::file::types_to_bypass_loading_; +// Replaces the raw multi-overload ctor with a friendlier keyword-based signature. +%feature("shadow") ifcopenshell::file::file %{ + def __init__(self, schema=None, schema_identifier=None, schema_version=None): + if schema_identifier is not None: + identifier = schema_identifier + else: + identifier = self._determine_schema_identifier(schema=schema, schema_version=schema_version) + $action(self, identifier) +%} + %ignore ifcopenshell::instance_streamer>::read_instance; %ignore ifcopenshell::instance_streamer>::steal_instances; @@ -392,10 +402,6 @@ private: header = property(header) _registry = {} - _old_init = __init__ - def __init__(self, schema=None, schema_identifier=None, schema_version=None): - self._old_init(schema_identifier if schema_identifier else self._determine_schema_identifier(schema=schema, schema_version=schema_version)) - def __setattr__(self, k, v): object.__setattr__(self, k, v) if k == 'this':