TemperatureConverter 类如何增强输入验证和错误处理?-灵析社区

销售经理537

class TemperatureConverter: def __init__(self): self.conversion_factors = { 'CtoF': (lambda c: c * 9/5 + 32), 'FtoC': (lambda f: (f - 32) * 5/9), 'CtoK': (lambda c: c + 273.15), 'KtoC': (lambda k: k - 273.15), 'FtoK': (lambda f: (f - 32) * 5/9 + 273.15), 'KtoF': (lambda k: (k - 273.15) * 9/5 + 32) } def convert(self, value, from_unit, to_unit): key = from_unit + 'to' + to_unit if key in self.conversion_factors: return self.conversion_factors[key](value) else: raise ValueError("Invalid conversion units") ## 测试代码 converter = TemperatureConverter() ## 测试转换 print(converter.convert(100, 'C', 'F')) # 期望输出: 212.0 print(converter.convert(32, 'F', 'C')) # 期望输出: 0.0 print(converter.convert(0, 'C', 'K')) # 期望输出: 273.15 print(converter.convert(273.15, 'K', 'C')) # 期望输出: 0.0 ## 复杂场景测试 print(converter.convert(100, 'C', 'K')) # 期望输出: 373.15 print(converter.convert(-40, 'F', 'C')) # 期望输出: -40.0 print(converter.convert(-273.15, 'C', 'K')) # 期望输出: 0.0 ## 错误处理测试 print(converter.convert(100, 'C', 'X')) # 期望输出: ValueError 上面的代码定义了一个温度转换器类 TemperatureConverter,它可以在摄氏度(C)、华氏度(F)和开尔文(K)之间进行转换。请给出优化建议: 存在的问题如下: 1. 缺乏输入值验证:当传入非数字或无效的字符串时,程序可能会抛出异常或产生意外结果。 2. 未处理的边界条件:例如,处理极端温度值时可能会出现问题。 3. 错误的错误处理:在最后一个测试用例中,当输入无效的单位组合时,应该抛出一个 ValueError,但代码中的实现可能不够健壮。 4. 重复计算:转换过程中可能会有不必要的重复计算,优化潜力不大,但在更复杂的情况下可能会影响性能。

阅读量:145

点赞量:0

问AI
为了增强 "TemperatureConverter" 类的输入验证和错误处理,进行以下优化: 1. 输入值验证 :确保输入的值是数字。 2. 单位验证 :确保 "from_unit" 和 "to_unit" 是有效的单位。 3. 边界条件处理 :处理极端温度值,比如开尔文温度不能为负。 4. 改进错误处理 :改进错误处理机制,使其更加健壮和清晰。 下面是改进后的代码: class TemperatureConverter: def __init__(self): self.conversion_factors = { 'CtoF': (lambda c: c * 9 / 5 + 32), 'FtoC': (lambda f: (f - 32) * 5 / 9), 'CtoK': (lambda c: c + 273.15), 'KtoC': (lambda k: k - 273.15), 'FtoK': (lambda f: (f - 32) * 5 / 9 + 273.15), 'KtoF': (lambda k: (k - 273.15) * 9 / 5 + 32) } self.valid_units = {'C', 'F', 'K'} def validate_input(self, value, from_unit, to_unit): if not isinstance(value, (int, float)): raise TypeError("Value must be a number") if from_unit not in self.valid_units or to_unit not in self.valid_units: raise ValueError(f"Invalid conversion units: {from_unit} to {to_unit}") if from_unit == 'K' and value < 0: raise ValueError("Kelvin temperature cannot be negative") def convert(self, value, from_unit, to_unit): self.validate_input(value, from_unit, to_unit) key = from_unit + 'to' + to_unit if key in self.conversion_factors: result = self.conversion_factors[key](value) if to_unit == 'K' and result < 0: raise ValueError("Resulting temperature in Kelvin cannot be negative") return result else: raise ValueError("Conversion from {} to {} is not supported".format(from_unit, to_unit)) # 测试代码 converter = TemperatureConverter() # 测试转换 print(converter.convert(100, 'C', 'F')) # 期望输出: 212.0 print(converter.convert(32, 'F', 'C')) # 期望输出: 0.0 print(converter.convert(0, 'C', 'K')) # 期望输出: 273.15 print(converter.convert(273.15, 'K', 'C')) # 期望输出: 0.0 # 复杂场景测试 print(converter.convert(100, 'C', 'K')) # 期望输出: 373.15 print(converter.convert(-40, 'F', 'C')) # 期望输出: -40.0 print(converter.convert(-273.15, 'C', 'K')) # 期望输出: 0.0 # 错误处理测试 try: print(converter.convert("hundred", 'C', 'F')) # 期望输出: TypeError except Exception as e: print(e) try: print(converter.convert(-300, 'C', 'K')) # 期望输出: ValueError except Exception as e: print(e) try: print(converter.convert(100, 'C', 'X')) # 期望输出: ValueError except Exception as e: print(e) 改进说明 1. 输入值验证 :"validate_input" 方法检查 "value" 是否为数字,并验证单位是否有效。 2. 单位验证 :在 "validate_input" 方法中检查 "from_unit" 和 "to_unit" 是否在有效单位集合中。 3. 边界条件处理 :添加了对开尔文温度不能为负的验证。 4. 改进错误处理 :"convert" 方法中进一步细化了错误消息,使其更加清晰。 5. 确保输出合理 :在结果计算后检查,如果 "to_unit" 为 "K",确保结果不会为负。 通过改进,"TemperatureConverter" 类现在更加健壮,可以更好地处理无效输入和极端值。