From e7b9d6f274ae64000a3a5a967c9491a5dcfd17cd Mon Sep 17 00:00:00 2001 From: syntron Date: Sat, 9 Aug 2025 21:00:31 +0200 Subject: [PATCH 1/4] [ModelicaSystem] add/update type hints for get*() functions --- OMPython/ModelicaSystem.py | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/OMPython/ModelicaSystem.py b/OMPython/ModelicaSystem.py index bdbebbc9..c2cda034 100644 --- a/OMPython/ModelicaSystem.py +++ b/OMPython/ModelicaSystem.py @@ -685,7 +685,10 @@ def getQuantities(self, names: Optional[str | list[str]] = None) -> list[dict]: raise ModelicaSystemError("Unhandled input for getQuantities()") - def getContinuous(self, names: Optional[str | list[str]] = None): + def getContinuous( + self, + names: Optional[str | list[str]] = None, + ) -> dict[str, str | numbers.Real] | list[str | numbers.Real]: """Get values of continuous signals. If called before simulate(), the initial values are returned as @@ -757,7 +760,10 @@ def getContinuous(self, names: Optional[str | list[str]] = None): raise ModelicaSystemError("Unhandled input for getContinous()") - def getParameters(self, names: Optional[str | list[str]] = None) -> dict[str, str] | list[str]: # 5 + def getParameters( + self, + names: Optional[str | list[str]] = None, + ) -> dict[str, str] | list[str]: """Get parameter values. Args: @@ -788,7 +794,10 @@ def getParameters(self, names: Optional[str | list[str]] = None) -> dict[str, st raise ModelicaSystemError("Unhandled input for getParameters()") - def getInputs(self, names: Optional[str | list[str]] = None) -> dict | list: # 6 + def getInputs( + self, + names: Optional[str | list[str]] = None, + ) -> dict[str, list[tuple[numbers.Real]]] | list[tuple[numbers.Real]]: """Get values of input signals. Args: @@ -822,7 +831,10 @@ def getInputs(self, names: Optional[str | list[str]] = None) -> dict | list: # raise ModelicaSystemError("Unhandled input for getInputs()") - def getOutputs(self, names: Optional[str | list[str]] = None): # 7 + def getOutputs( + self, + names: Optional[str | list[str]] = None, + ) -> dict[str, str | numbers.Real] | list[str | numbers.Real]: """Get values of output signals. If called before simulate(), the initial values are returned as @@ -890,7 +902,10 @@ def getOutputs(self, names: Optional[str | list[str]] = None): # 7 raise ModelicaSystemError("Unhandled input for getOutputs()") - def getSimulationOptions(self, names: Optional[str | list[str]] = None) -> dict[str, str] | list[str]: + def getSimulationOptions( + self, + names: Optional[str | list[str]] = None, + ) -> dict[str, str] | list[str]: """Get simulation options such as stopTime and tolerance. Args: @@ -924,7 +939,10 @@ def getSimulationOptions(self, names: Optional[str | list[str]] = None) -> dict[ raise ModelicaSystemError("Unhandled input for getSimulationOptions()") - def getLinearizationOptions(self, names: Optional[str | list[str]] = None) -> dict | list: + def getLinearizationOptions( + self, + names: Optional[str | list[str]] = None, + ) -> dict[str, str | numbers.Real] | list[str | numbers.Real]: """Get simulation options used for linearization. Args: @@ -959,7 +977,10 @@ def getLinearizationOptions(self, names: Optional[str | list[str]] = None) -> di raise ModelicaSystemError("Unhandled input for getLinearizationOptions()") - def getOptimizationOptions(self, names: Optional[str | list[str]] = None) -> dict | list: + def getOptimizationOptions( + self, + names: Optional[str | list[str]] = None, + ) -> dict[str, str | numbers.Real] | list[str | numbers.Real]: """Get simulation options used for optimization. Args: From 6eaf3eeee7bcfa7943a9973b114967bef51aecf6 Mon Sep 17 00:00:00 2001 From: syntron Date: Sat, 8 Nov 2025 12:08:16 +0100 Subject: [PATCH 2/4] [ModelicaSystem] fix definition of simulate() --- OMPython/ModelicaSystem.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OMPython/ModelicaSystem.py b/OMPython/ModelicaSystem.py index c2cda034..ff46302c 100644 --- a/OMPython/ModelicaSystem.py +++ b/OMPython/ModelicaSystem.py @@ -1095,7 +1095,7 @@ def simulate_cmd( def simulate( self, - resultfile: Optional[str] = None, + resultfile: Optional[str | os.PathLike] = None, simflags: Optional[str] = None, simargs: Optional[dict[str, Optional[str | dict[str, Any] | numbers.Number]]] = None, timeout: Optional[float] = None, From 7db5e97c3553a278f35a933c47335e2571e5ac4f Mon Sep 17 00:00:00 2001 From: syntron Date: Sat, 8 Nov 2025 12:31:44 +0100 Subject: [PATCH 3/4] [ModelicaSystem] more type hints fixes / cleanups --- OMPython/ModelicaSystem.py | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/OMPython/ModelicaSystem.py b/OMPython/ModelicaSystem.py index ff46302c..4ee34425 100644 --- a/OMPython/ModelicaSystem.py +++ b/OMPython/ModelicaSystem.py @@ -377,7 +377,7 @@ def __init__( self._quantities: list[dict[str, Any]] = [] self._params: dict[str, str] = {} # even numerical values are stored as str - self._inputs: dict[str, list | None] = {} + self._inputs: dict[str, list[tuple[float, float]]] = {} # _outputs values are str before simulate(), but they can be # np.float64 after simulate(). self._outputs: dict[str, Any] = {} @@ -386,8 +386,15 @@ def __init__( self._simulate_options: dict[str, str] = {} self._override_variables: dict[str, str] = {} self._simulate_options_override: dict[str, str] = {} - self._linearization_options = {'startTime': 0.0, 'stopTime': 1.0, 'stepSize': 0.002, 'tolerance': 1e-8} - self._optimization_options = self._linearization_options | {'numberOfIntervals': 500} + self._linearization_options: dict[str, str | float] = { + 'startTime': 0.0, + 'stopTime': 1.0, + 'stepSize': 0.002, + 'tolerance': 1e-8, + } + self._optimization_options = self._linearization_options | { + 'numberOfIntervals': 500, + } self._linearized_inputs: list[str] = [] # linearization input list self._linearized_outputs: list[str] = [] # linearization output list self._linearized_states: list[str] = [] # linearization states list @@ -797,7 +804,7 @@ def getParameters( def getInputs( self, names: Optional[str | list[str]] = None, - ) -> dict[str, list[tuple[numbers.Real]]] | list[tuple[numbers.Real]]: + ) -> dict[str, list[tuple[float, float]]] | list[list[tuple[float, float]]]: """Get values of input signals. Args: @@ -942,7 +949,7 @@ def getSimulationOptions( def getLinearizationOptions( self, names: Optional[str | list[str]] = None, - ) -> dict[str, str | numbers.Real] | list[str | numbers.Real]: + ) -> dict[str, str | float] | list[str | float]: """Get simulation options used for linearization. Args: @@ -980,7 +987,7 @@ def getLinearizationOptions( def getOptimizationOptions( self, names: Optional[str | list[str]] = None, - ) -> dict[str, str | numbers.Real] | list[str | numbers.Real]: + ) -> dict[str, str | float] | list[str | float]: """Get simulation options used for optimization. Args: @@ -1789,9 +1796,9 @@ def linearize( continue target = body_part.targets[0].id # type: ignore - value = ast.literal_eval(body_part.value) + value_ast = ast.literal_eval(body_part.value) - linear_data[target] = value + linear_data[target] = value_ast except (AttributeError, IndexError, ValueError, SyntaxError, TypeError) as ex: raise ModelicaSystemError(f"Error parsing linearization file {linear_file}!") from ex From b84a73bd94ca8dfb8bb7b8a3cca59412779d1a27 Mon Sep 17 00:00:00 2001 From: syntron Date: Sat, 8 Nov 2025 12:40:12 +0100 Subject: [PATCH 4/4] indicate that OMPython includes type hints via py.typed see: https://mypy.readthedocs.io/en/stable/installed_packages.html#installed-packages see: https://blog.whtsky.me/tech/2021/dont-forget-py.typed-for-your-typed-python-package/ see: https://stackoverflow.com/questions/76073605/add-py-typed-as-package-data-with-setuptools-in-pyproject-toml --- OMPython/py.typed | 0 pyproject.toml | 3 +++ 2 files changed, 3 insertions(+) create mode 100644 OMPython/py.typed diff --git a/OMPython/py.typed b/OMPython/py.typed new file mode 100644 index 00000000..e69de29b diff --git a/pyproject.toml b/pyproject.toml index e82745c9..70708682 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,6 +25,9 @@ dependencies = [ [tool.setuptools] packages = ["OMPython"] +[tool.setuptools.package-data] +"OMPython" = ["py.typed"] + [project.urls] Homepage = "http://openmodelica.org/" Documentation = "https://openmodelica.org/doc/OpenModelicaUsersGuide/latest/ompython.html"