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.MutableMapping
list
->collections.abc.MutableSequence
str
-> 不存在此类转换