From 839db5b095b431019400622cb10a8a967dcfb7eb Mon Sep 17 00:00:00 2001 From: PONS Date: Thu, 10 Sep 2026 07:16:42 +0200 Subject: [PATCH] Fix typing for _fill_device() methods --- pyaml/bpm/bpm.py | 7 +++++-- pyaml/common/element.py | 6 ++++++ pyaml/configuration/unbound_element.py | 7 ++++++- pyaml/diagnostics/tune_monitor.py | 7 +++++-- pyaml/magnet/cfm_magnet.py | 7 ++++++- pyaml/magnet/magnet.py | 7 +++++-- pyaml/magnet/serialized_magnet.py | 7 ++++++- pyaml/rf/rf_plant.py | 7 +++++-- 8 files changed, 44 insertions(+), 11 deletions(-) diff --git a/pyaml/bpm/bpm.py b/pyaml/bpm/bpm.py index bf16e26a..a50e4975 100644 --- a/pyaml/bpm/bpm.py +++ b/pyaml/bpm/bpm.py @@ -1,13 +1,16 @@ """Beam-position monitor elements and their runtime interfaces.""" import copy -from typing import Self +from typing import TYPE_CHECKING, Self from ..common.abstract import ReadFloatArray, ReadWriteFloatArray, ReadWriteFloatScalar from ..common.element import Element, __pyaml_repr__ from ..common.exception import PyAMLException from ..validation import DynamicValidation, register_schema +if TYPE_CHECKING: + from ..common.holders.element_holder import ElementHolder + PYAMLCLASS = "BPM" @@ -176,7 +179,7 @@ def attach( obj._peer = peer return obj - def _fill_device(self, holder) -> None: + def _fill_device(self, holder: "ElementHolder") -> None: holder._fill_bpm(self) def get_pos_devices(self) -> list[str | None]: diff --git a/pyaml/common/element.py b/pyaml/common/element.py index ca4d2204..d8614b6d 100644 --- a/pyaml/common/element.py +++ b/pyaml/common/element.py @@ -268,6 +268,12 @@ def attached_to(self) -> str: """ return "None" if self._peer is None else f"{self._peer.__class__.__name__}:{self._peer.name()}" + def _fill_device(self, holder: "ElementHolder"): + """ + Add this element to a holder (Simultor or ControlSystem) + """ + raise PyAMLException(f"__fill_device() is not implemented for {self.__class__.__name__}") + def post_init(self): """ Perform post-construction initialization after attachment. diff --git a/pyaml/configuration/unbound_element.py b/pyaml/configuration/unbound_element.py index 3e44f016..1e1c58d9 100644 --- a/pyaml/configuration/unbound_element.py +++ b/pyaml/configuration/unbound_element.py @@ -6,11 +6,16 @@ known and the concrete element can be instantiated. """ +from typing import TYPE_CHECKING + from pydantic import BaseModel from ..common.element import Element from ..common.exception import PyAMLConfigException +if TYPE_CHECKING: + from ..common.holders.element_holder import ElementHolder + class UnboundElement(Element): """ @@ -54,7 +59,7 @@ def __repr__(self): self._module_name, ) - def _fill_device(self, holder) -> None: + def _fill_device(self, holder: "ElementHolder") -> None: holder._fill_unbound_element(self) def instantiate(self, holder) -> Element: diff --git a/pyaml/diagnostics/tune_monitor.py b/pyaml/diagnostics/tune_monitor.py index bc8831a3..3b5206d7 100644 --- a/pyaml/diagnostics/tune_monitor.py +++ b/pyaml/diagnostics/tune_monitor.py @@ -6,7 +6,7 @@ """ import copy -from typing import Self +from typing import TYPE_CHECKING, Self from numpy.typing import NDArray @@ -15,6 +15,9 @@ from ..validation import DynamicValidation, register_schema from .atune_monitor import ABetatronTuneMonitor +if TYPE_CHECKING: + from ..common.holders.element_holder import ElementHolder + PYAMLCLASS = "BetatronTuneMonitor" @@ -90,7 +93,7 @@ def set_harmonic(self, h: int): """ self._h = float(h) - def _fill_device(self, holder) -> None: + def _fill_device(self, holder: "ElementHolder") -> None: holder._fill_betatron_tune_monitor(self) @property diff --git a/pyaml/magnet/cfm_magnet.py b/pyaml/magnet/cfm_magnet.py index 26e2c0af..eb7db64e 100644 --- a/pyaml/magnet/cfm_magnet.py +++ b/pyaml/magnet/cfm_magnet.py @@ -5,6 +5,8 @@ provide separate strength and hardware access for those components. """ +from typing import TYPE_CHECKING + from scipy.constants import speed_of_light from ..common import abstract @@ -24,6 +26,9 @@ from .skewsext import SkewSext from .vcorrector import VCorrector +if TYPE_CHECKING: + from ..common.holders.element_holder import ElementHolder + _fmap: dict = { "B0": HCorrector, "A0": VCorrector, @@ -131,7 +136,7 @@ def __init__( # Attach self._peer = peer - def _fill_device(self, holder) -> None: + def _fill_device(self, holder: "ElementHolder") -> None: holder._fill_combined_function_magnet(self) def get_model_name(self) -> str: diff --git a/pyaml/magnet/magnet.py b/pyaml/magnet/magnet.py index 4ed9860c..daa2db7d 100644 --- a/pyaml/magnet/magnet.py +++ b/pyaml/magnet/magnet.py @@ -6,7 +6,7 @@ """ import copy -from typing import Self +from typing import TYPE_CHECKING, Self import numpy as np from scipy.constants import speed_of_light @@ -16,6 +16,9 @@ from ..common.element import Element from .model import MagnetModel +if TYPE_CHECKING: + from ..common.holders.element_holder import ElementHolder + class Magnet(Element): """ @@ -131,7 +134,7 @@ def attach( obj._peer = peer return obj - def _fill_device(self, holder) -> None: + def _fill_device(self, holder: "ElementHolder") -> None: holder._fill_magnet(self) def set_energy(self, energy: float): diff --git a/pyaml/magnet/serialized_magnet.py b/pyaml/magnet/serialized_magnet.py index 14bdd29c..58ef4422 100644 --- a/pyaml/magnet/serialized_magnet.py +++ b/pyaml/magnet/serialized_magnet.py @@ -4,6 +4,8 @@ This module defines magnet elements composed of multiple serialized magnets. """ +from typing import TYPE_CHECKING + import numpy as np from scipy.constants import speed_of_light @@ -16,6 +18,9 @@ from .magnet import Magnet from .model import MagnetModel +if TYPE_CHECKING: + from ..common.holders.element_holder import ElementHolder + # Define the main class name for this module PYAMLCLASS = "SerializedMagnets" @@ -257,7 +262,7 @@ def __init__( # Attach self._peer = peer - def _fill_device(self, holder) -> None: + def _fill_device(self, holder: "ElementHolder") -> None: holder._fill_serialized_magnets(self) def __create_virtual_magnet(self, name: str) -> Magnet: diff --git a/pyaml/rf/rf_plant.py b/pyaml/rf/rf_plant.py index 722c5a47..4a005537 100644 --- a/pyaml/rf/rf_plant.py +++ b/pyaml/rf/rf_plant.py @@ -7,7 +7,7 @@ """ import copy -from typing import Self +from typing import TYPE_CHECKING, Self from .. import PyAMLException from ..common import abstract @@ -15,6 +15,9 @@ from ..validation import DynamicValidation, register_schema from .rf_transmitter import RFTransmitter +if TYPE_CHECKING: + from ..common.holders.element_holder import ElementHolder + # Define the main class name for this module PYAMLCLASS = "RFPlant" @@ -115,7 +118,7 @@ def attach( obj._peer = peer return obj - def _fill_device(self, holder) -> None: + def _fill_device(self, holder: "ElementHolder") -> None: holder._fill_rf_plant(self)