subclass-builtin (FURB189)
派生自 refurb 代码检查工具。
修复总是可用的。
此规则不稳定且处于预览状态。使用需要 --preview 标志。
作用
检查 dict、list 或 str 的子类。
为什么这不好?
内置类型并非始终一致地使用自己的双下划线方法。 例如,dict.__init__ 和 dict.update() 绕过 __setitem__,使继承不可靠。
请改用 collections 模块中的 UserDict、UserList 和 UserString 对象。
示例
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 类时,对 dict、list 和 str 类型的 isinstance() 检查将失败。 如果需要将自定义 dict 或 list 对象传递给您无法控制的代码,请忽略此检查。 如果您控制代码,请考虑改用以下类型检查
dict->collections.abc.MutableMappinglist->collections.abc.MutableSequencestr-> 不存在此类转换