【发布时间】: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