跳到内容

subclass-builtin (FURB189)

派生自 refurb 代码检查工具。

修复总是可用的。

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

作用

检查 dictliststr 的子类。

为什么这不好?

内置类型并非始终一致地使用自己的双下划线方法。 例如,dict.__init__dict.update() 绕过 __setitem__,使继承不可靠。

请改用 collections 模块中的 UserDictUserListUserString 对象。

示例

class UppercaseDict(dict):
    def __setitem__(self, key, value):
        super().__setitem__(key.upper(), value)


d = UppercaseDict({"a": 1, "b": 2})  # Bypasses __setitem__
print(d)  # {'a': 1, 'b': 2}

建议改为

from collections import UserDict


class UppercaseDict(UserDict):
    def __setitem__(self, key, value):
        super().__setitem__(key.upper(), value)


d = UppercaseDict({"a": 1, "b": 2})  # Uses __setitem__
print(d)  # {'A': 1, 'B': 2}

修复安全性

此修复被标记为不安全,因为在使用相应的 User 类时,对 dictliststr 类型的 isinstance() 检查将失败。 如果需要将自定义 dictlist 对象传递给您无法控制的代码,请忽略此检查。 如果您控制代码,请考虑改用以下类型检查

  • dict -> collections.abc.MutableMapping
  • list -> collections.abc.MutableSequence
  • str -> 不存在此类转换

参考