【问题标题】:Refactoring a series of nested try except blocks重构一系列嵌套的 try except 块
【发布时间】:2021-08-03 23:15:24
【问题描述】:

我有一个名为 bit 的类,用于编码 svg 矩形。该类是用一个变量实例化的,该变量说明 svg 矩形应该是什么颜色。我希望它接受四种样式的颜色。 hex、rgb 百分比三元组、rgb 整数三元组和命名。 init 函数然后将颜色值转换为十六进制。我已经让它工作了,但它依赖于嵌套的 try except 块和 webcolors 模块抛出的异常。如果一次转换失败,它会尝试下一次,依此类推,直到成功或引发最终异常。

import svgwrite
from webcolors import name_to_hex, normalize_integer_triplet, rgb_percent_to_hex, normalize_hex, normalize_percent_triplet, rgb_to_hex
             
dwg = svgwrite.Drawing('qr.svg')

class Bit:
    def __init__(self, bit_color:str, spec:str='css3'):
        self.bit_type=1
        self.spec=spec
        try:
            self.bit_color=name_to_hex(bit_color,spec)
        except (ValueError, AttributeError):
            try:
                self.bit_color=rgb_to_hex(normalize_integer_triplet(bit_color))
            except (ValueError, TypeError):
                try:
                    self.bit_color=rgb_percent_to_hex(normalize_percent_triplet(bit_color))   
                except ValueError:
                    try:
                        self.bit_color=normalize_hex(bit_color)
                    except ValueError:
                        raise ValueError('Color not recognized!')

虽然这可以让用户以最常见的方式输入颜色,但它对我来说看起来很丑陋。有没有办法重构这个?

【问题讨论】:

  • 颜色数据从何而来?它基本上是来自最终用户,还是期望程序员使用这个类来处理来自标准化源的不同格式?
  • 似乎“通常”的重构方法是检查输入值以确定您拥有什么,而不是将数据扔到各种函数中以查看哪个函数不 i> 抛出和异常。
  • 我曾经在 JS 中写过一个颜色类。我的方法是使用正则表达式来确定输入格式(HEX、RGB、HSV、HSL、CMYK、NCOL、WebColor、...),然后使用适当的转换。
  • @Carcigenicate 颜色数据(即颜色字符串)将来自用户。我曾考虑使用正则表达式来确定输入,但由于 webcolors 库已经具有在数据错误时会引发异常的函数,所以我想我会使用它们而不是使用正则表达式并编写自己的异常。

标签: python exception try-catch


【解决方案1】:

一种可能性:

        try:
            self.bit_color=name_to_hex(bit_color, spec)
            return
        except (ValueError, AttributeError):
            pass
            
        try:
            self.bit_color=rgb_to_hex(normalize_integer_triplet(bit_color))
            return
        except (ValueError, TypeError):
            pass

        try:
            self.bit_color=rgb_percent_to_hex(normalize_percent_triplet(bit_color))   
            return
        except ValueError:
            pass

        try:
            self.bit_color=normalize_hex(bit_color)
        except ValueError:
            raise ValueError('Color not recognized!')

【讨论】:

  • 类初始化函数中的return语句有什么作用?
  • 与任何函数一样,它们会导致函数的执行停止。我假设设置 bit_color 是这个函数唯一要做的事情——如果不是,我会把这个逻辑推到一个辅助函数中。
  • 现在就是这样。我想保留向 init 函数添加更多内容的选项。我想我可以把它们放在这一步之前
  • @Samwise 抱歉误读了问题的最后部分!我删除了我的答案
猜你喜欢
  • 1970-01-01
  • 2013-08-11
  • 2020-09-23
  • 1970-01-01
  • 2014-08-23
  • 2020-11-26
  • 2013-11-21
  • 2013-08-13
  • 1970-01-01
相关资源
最近更新 更多