Python:当 class 在构建器外实例化时抛出警告

Python: Throw warning when class is instantiated outside builder

我有一个 class 构造函数变得过于复杂,所以我想使用构建器模式来管理所有构造步骤。

应用程序的一个重要部分依赖于实例化 class 的旧方法,所以我不能一次性全部替换它们。 我使用装饰器将某些方法标记为已弃用,但如果 class 在构建器 class.

之外实例化,我想发出警告

为了提供更多上下文,原始 class (Inverter) 的构造函数如下所示:

    def __init__(self, inverter_id: str, location: Tuple[str, str], plant_id: str,
                 customer_id: str, power_threshold: float = 0, resolution: int = 5,
                 **kwargs):
        """
        Creates a new inverter object.
        :param inverter_id:
            unique identifier of the inverter.
        """
        # metrics initialization
        self._customer_id = customer_id
        self._plant_id = plant_id
        self._expected_power = DataFrame()
        self._generated_power = DataFrame()
        self._total_pr = 0.0
        self._specific_performance = 0.0
        self._active_pr = 0.0
        self._generated_energy = 0.0
        self._expected_energy = 0.0
        self.__operational_time = {}
        self.__off_time = {}
        self.__savings = 0.0

        # parameters initialization
        self._power_threshold = power_threshold
        self._resolution = 5
        self._energy_rate = kwargs['energy_rate']
        self._lines = []
        # identification
        self._id = inverter_id
        self._location = location
        self._resolution = resolution

        # data storing
        self._inverter_electric_data = None
        self._inverter_environmental_data = None
        self._inverter_metadata = None

然后通过其他方法将许多参数提供给 class,我们的想法是将这些值提供给构建器 class,例如:

inverter = InverterBuilder().set_id("some_id").build()

我最初的想法是向构造函数添加弃用警告,但这会使构建器也抛出警告。

那么,当从构建器 class 外部调用原始 class 构造函数时,有没有办法发出警告?

例如,如果有人这样做,则发出警告:

inverter = Inverter(...)

作为附加说明,我正在使用 deprecation 库将方法标记为已弃用。

您原来的 __init__ 已经有一个 **kwargs 参数 - 使用它。

...
    def __init__(self, inverter_id: str, location: Tuple[str, str], plant_id: str,
                 customer_id: str, power_threshold: float = 0, resolution: int = 5,
                 **kwargs):
        """
        Creates a new inverter object.
        :param inverter_id:
            unique identifier of the inverter.
        """
        ...
        if kwargs.get('invokewarning',True):
            #issue warning

那么builder可以通过invokewarning=False

我想还有其他一些方法可以解决这个问题。