当前位置: 首页 > 知识库问答 >
问题:

python - TemperatureConverter 类如何增强输入验证和错误处理?

乌杰
2024-06-09

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. 重复计算:转换过程中可能会有不必要的重复计算,优化潜力不大,但在更复杂的情况下可能会影响性能。

共有2个答案

张积厚
2024-06-09

为了增强 TemperatureConverter 类的输入验证和错误处理,进行以下优化:

  1. 输入值验证:确保输入的值是数字。
  2. 单位验证:确保 from_unitto_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.0print(converter.convert(32, 'F', 'C'))   # 期望输出: 0.0print(converter.convert(0, 'C', 'K'))    # 期望输出: 273.15print(converter.convert(273.15, 'K', 'C')) # 期望输出: 0.0# 复杂场景测试print(converter.convert(100, 'C', 'K'))  # 期望输出: 373.15print(converter.convert(-40, 'F', 'C'))  # 期望输出: -40.0print(converter.convert(-273.15, 'C', 'K'))  # 期望输出: 0.0# 错误处理测试try:    print(converter.convert("hundred", 'C', 'F'))  # 期望输出: TypeErrorexcept Exception as e:    print(e)try:    print(converter.convert(-300, 'C', 'K'))  # 期望输出: ValueErrorexcept Exception as e:    print(e)try:    print(converter.convert(100, 'C', 'X'))  # 期望输出: ValueErrorexcept Exception as e:    print(e)

改进说明

  1. 输入值验证validate_input 方法检查 value 是否为数字,并验证单位是否有效。
  2. 单位验证:在 validate_input 方法中检查 from_unitto_unit 是否在有效单位集合中。
  3. 边界条件处理:添加了对开尔文温度不能为负的验证。
  4. 改进错误处理convert 方法中进一步细化了错误消息,使其更加清晰。
  5. 确保输出合理:在结果计算后检查,如果 to_unitK,确保结果不会为负。

通过改进,TemperatureConverter 类现在更加健壮,可以更好地处理无效输入和极端值。

张英范
2024-06-09

为了增强 TemperatureConverter 类的输入验证和错误处理,可以进行以下优化:

  1. 输入值验证

    • convert 方法中,增加对 value 的类型检查,确保它是一个数字类型。
    • 使用 try-except 块捕获潜在的异常,如 TypeError,并提供有意义的错误消息。
  2. 边界条件处理

    • 无需额外处理边界条件,因为现有的转换公式已经涵盖了所有可能的温度值(包括极端值)。
    • 如果担心极端值可能会导致数值不稳定或溢出,可以在转换前进行范围检查,但通常这不是必需的。
  3. 错误处理

    • 当输入无效的单位组合时,确保抛出的 ValueError 包含足够的信息来描述问题。
    • 可以在 convert 方法的开始处检查单位的有效性,如果无效则立即抛出异常。
  4. 性能优化

    • 对于这个简单的类来说,性能优化可能不是必要的,因为转换操作本身就很快速。
    • 如果存在性能瓶颈,可以考虑使用缓存机制来存储已经计算过的转换结果,但这在当前场景中不太可能成为问题。

下面是根据上述建议修改后的 TemperatureConverter 类:

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):        if not isinstance(value, (int, float)):            raise ValueError("Invalid input value. Expected a number.")        key = from_unit + 'to' + to_unit        if key not in self.conversion_factors:            raise ValueError(f"Invalid conversion units: from {from_unit} to {to_unit}")        return self.conversion_factors[key](value)# 测试代码(保持不变)

注意,我们增加了对 value 的类型检查,并在单位无效时提供了一个更详细的错误信息。这样,代码在面临非法输入时会更健壮,并能够提供更清晰的错误信息。

 类似资料:
  • 我试图找到一个完整的模式列表,用于通过HTML5表单验证各种类型的输入,特别是、、等等,但我找不到任何模式。目前,这些输入验证的内置版本远非完美(甚至不检查输入的内容是否是电话号码)。所以我想知道,我可以使用哪些模式来验证用户在输入中输入了正确的格式? 以下是一些默认验证允许不允许的输入的例子: 这个字段允许在@后面有不正确域的电子邮件,它允许地址以破折号或句号开始或结束,这也是不允许的。因此,是

  • 10倍验证精度得分:{0.7982993,0.6793838等(共10倍)}K倍平均精度得分:0.78679979 实际错误:

  • 问题内容: Python如何接受用户输入,并验证? 问题答案: 完成此操作的最简单方法是将方法置于循环中。当输入错误时使用,当你感到满意时使用。 当你的输入可能引发异常时 使用和检测用户何时输入了无法解析的数据。 实施你自己的验证规则 如果要拒绝Python可以成功解析的值,则可以添加自己的验证逻辑。 结合异常处理和自定义验证 以上两种技术都可以组合成一个循环。 将其全部封装在一个函数中 如果你需

  • 根据经验,您永远不应该信任从最终用户收到的数据, 并且应该在充分利用之前对其进行验证。 要给 model 填充其所需的用户输入数据,你可以调用 yii\base\Model::validate() 方法验证它们。该方法会返回一个布尔值,指明是否通过验证。若没有通过,你能通过 yii\base\Model::$errors 属性获取相应的报错信息。比如, $model = new \app\mode

  • 问题内容: 我是从记录用户输入使用。我需要验证输入内容,例如: 必须为非负数 它必须是字母 …等等 最好的方法是什么? 问题答案: 示例1:验证正整数 这是一个用于int从输入中验证肯定的简单示例。 结果: 请注意,与更详细组合相比,使用起来要容易得多。通过合同,一个 保证,如果它,然后将安静地给你int,并不会引发任何。 示例2:同一令牌上有多个 请注意,上面的代码段包含一个语句,以使Scann

  • 我正在使用一个旋转控制器来接受整数值。如何限制输入只接受整数?目前,当输入字符串值时,我会在控制台中得到错误消息。我不想让纺纱机接受任何其他类型-例如。双或串。 另外,如何在旋转器上实现错误处理?

  • 我有一个案例,我想对endpoint的@Request estParams进行一些输入验证。 我知道Validator和Custom Validator,我目前的策略意味着围绕Request estParams创建一个包装器对象,一个自定义验证器并应用类级别的注释来触发自定义验证。 我的问题是,自定义验证正在实现ConstraintValidator,这意味着验证器将返回true或false,Sp

  • 我正试图决定如何处理猫鼬中的验证错误。 我使用节点验证器定义了自己的验证规则,例如: 这将产生如下错误: 然而,节点验证器提供了自己的错误消息。如果我使用mongoose validator节点模块将节点验证器直接插入到我的模式中,那么我可以直接使用这些错误消息: 这将生成一条错误消息,如下所示: 我也可以在此处提供自定义错误消息: Mongoose允许您根据需要定义字段: 这将生成一条错误消息,