如何优化含有大量常量的代码?

问题描述 投票:0回答:1

有一些数学计算的代码,其中不仅计算值,而且检查它们是否属于可接受的范围。类中的常量用于存储范围,但这导致常量数量很大,是否可以以某种方式优化它?

from dataclasses import dataclass
from enum import Enum


class RecommendedNumberInputHoles(Enum):
    MAX_NUMBER_INPUT_HOLES = 6
    MIN_NUMBER_INPUT_HOLES = 2


class RecommendedDiameterRange(Enum):
    MAX_RECOMMENDED_DIAMETER = 2.5
    MIN_RECOMMENDED_DIAMETER = 0.5


class RelativeLength(Enum):
    MAX_RELATIVE_LENGTH = 6.0
    MIN_RELATIVE_LENGTH = 1.5


@dataclass(frozen=True, slots=True)
class CentrifugalLiquidInjector:
    outer_diameter_injector: float
    side_wall_thickness_injector: float
    number_input_tangential_holes: float

    diameter_input_tangential_holes: float
    length_input_tangential_holes: float

    relative_length_twisting_chamber: float

    def __post_init__(self):
        if not (RecommendedNumberInputHoles.MIN_NUMBER_INPUT_HOLES.value >= self.number_input_tangential_holes <=
                RecommendedDiameterRange.MAX_RECOMMENDED_DIAMETER.value):
            raise ValueError(f"Значение {self.number_input_tangential_holes} количества входных тангенциальных"
                             f"отверстий не входит в рекомендуемый диапазон"
                             f"[{RecommendedNumberInputHoles.MIN_NUMBER_INPUT_HOLES.value}..."
                             f"{RecommendedDiameterRange.MAX_RECOMMENDED_DIAMETER.value}]")

        if not (RecommendedDiameterRange.MIN_RECOMMENDED_DIAMETER.value >= self.diameter_input_tangential_holes <=
                RecommendedDiameterRange.MAX_RECOMMENDED_DIAMETER.value):
            raise ValueError(f"Значение {self.diameter_input_tangential_holes} диаметров входных тангенциальных"
                             f"отверстий не входит в рекомендуемый диапазон"
                             f"[{RecommendedDiameterRange.MIN_RECOMMENDED_DIAMETER.value}..."
                             f"{RecommendedDiameterRange.MAX_RECOMMENDED_DIAMETER.value}]")

    @property
    def diameter_twisting_chamber_injector(self) -> float:
        return self.outer_diameter_injector - 2 * self.side_wall_thickness_injector

    @property
    def relative_length_tangential_hole(self) -> float:
        value_relative_length = self.length_input_tangential_holes / self.diameter_input_tangential_holes

        if not(RelativeLength.MIN_RELATIVE_LENGTH.value >= value_relative_length <=
               RelativeLength.MAX_RELATIVE_LENGTH.value):
            raise ValueError(f"Значение {value_relative_length} относительной длины входного тангенциального отверстия"
                             f"не входит в допустимый диапазон [{RelativeLength.MIN_RELATIVE_LENGTH.value}..."
                             f"{RelativeLength.MAX_RELATIVE_LENGTH.value}]")
        else:
            return value_relative_length
python python-3.x oop optimization
1个回答
0
投票
  1. 如果您必须以这种方式使用

    Enum
    ,那么
    IntEnum
    会更好,因为枚举值是
    int
    ,并且在所有操作之后都不需要
    .value

  2. 为了测试某些内容是否在某个范围内,Pythonic 解决方案很好,即

    in
    运算符——因此您可能需要添加一个可以通过这种方式操作的自定义范围类(内置
    range 
    只能做整数):

class AcceptableRange:
    def __init__(self, min, max):
        self.min = min
        self.max = max

    def __contains__(self, val):
        """Return true if the value is within the acceptable range of values"""
        return self.min <= val <= self.max

    def __repr__(self):
        """Format the range for e.g. pasting into error messages"""
        return f"[{self.min}...{self.max}]"

# then use like so:
RelativeLengthRange = AcceptableRange(1.5, 6.0)

...
         # in property relative_length_tangential_hole()
         if value_relative_length not in RelativeLengthRange:
            raise ValueError(f"Значение {value_relative_length} относительной длины входного тангенциального отверстия " # (nitpick: add space)
                             f"не входит в допустимый диапазон {RelativeLengthRange!r}")
         # rest of function
© www.soinside.com 2019 - 2024. All rights reserved.