有一些数学计算的代码,其中不仅计算值,而且检查它们是否属于可接受的范围。类中的常量用于存储范围,但这导致常量数量很大,是否可以以某种方式优化它?
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
如果您必须以这种方式使用
Enum
,那么 IntEnum
会更好,因为枚举值是 int
,并且在所有操作之后都不需要 .value
。
为了测试某些内容是否在某个范围内,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