Как передать значение из одной функции в другую с dataclass?

Как передать значение из одной функции в другую с dataclass?

from src.centrifugal_injector_calc import Injector
from dataclasses import dataclass


@dataclass(frozen=True, slots=True)
class InjectorRange:
    common = {
        "outer_diameter_injector": 0,
        "side_wall_thickness_injector": 1,
        "number_input_tangential_holes": 1,
        "diameter_input_tangential_holes": 1,
        "length_input_tangential_holes": 1,
        "relative_length_twisting_chamber": 1,
        "diameter_injector_nozzle": 1,
        "relative_length_injector_nozzle": 1,
        "angle_nozzle_axis": 1,
        "mass_flow_rate": 1,
        "viscosity": 1,
        "cross_sectional_area_one_passage_channel": 1,
        "density_fuel_component_front_injector": 1,
        "density_combustion_products": 1,
        "surface_tension_coefficient": 1,

        "injector_type": "CENTRIFUGAL"
    }

    centrifugal_injector = Injector(
        **common
    )

    @property
    def determining_value(self):
        """Возвращает название переменной в которой присутствует недопустимое значение"""
        return 0

    @property
    def checking_zero_value(self):
        """Возвращает сообщение об ошибке в случае если в словаре common будут найдены параметры со значением 0"""
        for key, value in self.common.items():
            if value == 0:
                raise ValueError(f"Введеное значение {self.determining_value} равняется 0, измените значение"
                                 f"переменной на допустимое")

Есть вот такой код, и нужно передать значение key из функции checking_zero_value в функцию determining_value. Как это сделать?


Ответы (1 шт):

Автор решения: insolor

Убираете декоратор @property, и вызываете determining_value просто как метод. При вызове в него передаете значение key (нужно добавить соответствующий параметр в сам метод, не убирая self):

@dataclass(frozen=True, slots=True)
class InjectorRange:

    ...

    def determining_value(self, key):
        """Возвращает название переменной в которой присутствует недопустимое значение"""
        return 0

    @property
    def checking_zero_value(self):
        """Возвращает сообщение об ошибке в случае если в словаре common будут найдены параметры со значением 0"""
        for key, value in self.common.items():
            if value == 0:
                raise ValueError(f"Введеное значение {self.determining_value(key)} равняется 0, измените значение"
                                 f"переменной на допустимое")

Если результат метода никак от self не зависит, можно объявить метод статическим, и self убрать:

@dataclass(frozen=True, slots=True)
class InjectorRange:

    ...

    @staticmethod
    def determining_value(key):
        """Возвращает название переменной в которой присутствует недопустимое значение"""
        return 0

    @property
    def checking_zero_value(self):
        """Возвращает сообщение об ошибке в случае если в словаре common будут найдены параметры со значением 0"""
        for key, value in self.common.items():
            if value == 0:
                raise ValueError(f"Введеное значение {self.determining_value(key)} равняется 0, измените значение"
                                 f"переменной на допустимое")

Статический метод — это по сути отдельная функция (не зависящая от объекта или класса), но почему-то программист решил, что по смыслу она относится к классу, и есть смысл ее поместить в класс.

→ Ссылка