Python: выдает предупреждение, когда создается экземпляр класса за пределами застройщика - PullRequest
1 голос
/ 21 февраля 2020

У меня есть класс, конструктор которого становится слишком сложным, поэтому я хотел использовать шаблон компоновщика для управления всеми этапами построения.

Важная часть приложения зависит от старого способа создания экземпляров. класс, так что я не могу просто заменить их все в одном go. Я использовал декоратор, чтобы пометить некоторые методы как устаревшие, но я хотел бы выдать предупреждение, если экземпляр класса создается вне класса построителя.

Чтобы дать немного больше контекста, конструктор Исходный класс (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

И многие параметры затем передаются в класс другими методами, и идея заключается в том, чтобы передать эти значения в класс построителя, например:

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

Моя первоначальная идея состояла в том, чтобы добавить предупреждение об устаревании в конструктор, но это заставило бы строителя также выдать предупреждение.

Итак, есть ли способ выдать предупреждение, когда оригинальный конструктор класса вызывается извне класса построителя?

Например, если кто-то делает предупреждение, например:

inverter = Inverter(...)

В качестве дополнительного примечания я использую deprecation библиотека для пометки методов как устаревших.

1 Ответ

2 голосов
/ 21 февраля 2020

Ваш исходный __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

Тогда строитель может передать invokewarning=False.

Я думаю, есть несколько других способов решить эту проблему.

...