跳到内容

unnecessary-from-float (FURB164)

派生自 refurb 代码检查工具。

有时提供修复。

此规则不稳定且处于预览状态。使用需要 --preview 标志。

作用

检查不必要的 from_floatfrom_decimal 用法,以构造 DecimalFraction 实例。

为什么这不好?

自 Python 3.2 起,可以通过将浮点数或 decimal 实例直接传递给构造函数来构造 FractionDecimal 类。 因此,使用 from_floatfrom_decimal 方法是不必要的,应该避免使用更简洁的构造函数语法。

但是,from_* 方法和构造函数之间存在重要的行为差异

  • from_* 方法验证其参数类型,并为无效类型引发 TypeError
  • 构造函数接受更广泛的参数类型,而无需验证
  • from_* 方法的参数名称与构造函数不同

示例

Decimal.from_float(4.2)
Decimal.from_float(float("inf"))
Fraction.from_float(4.2)
Fraction.from_decimal(Decimal("4.2"))

建议改为

Decimal(4.2)
Decimal("inf")
Fraction(4.2)
Fraction(Decimal(4.2))

修复安全性

默认情况下,此规则的修复被标记为不安全,因为

  • from_* 方法提供构造函数不提供的类型验证
  • 删除类型验证可能会更改程序行为
  • 方法和构造函数之间的参数名称不同

只有在以下情况下,修复才会标记为安全

  • 已知参数类型对于目标构造函数有效
  • 未使用任何关键字参数,或者它们与构造函数的参数匹配

参考