跳到内容

不可靠的可调用检查 (B004)

源自 flake8-bugbear linter。

有时提供修复。

作用

检查是否使用 hasattr 来测试对象是否可调用(例如,hasattr(obj, "__call__"))。

为什么这不好?

使用 hasattr 是一种不可靠的机制来测试对象是否可调用。如果 obj 实现了自定义的 __getattr__,或者其 __call__ 本身不可调用,您可能会得到误导性的结果。

相反,使用 callable(obj) 来测试 obj 是否可调用。

示例

hasattr(obj, "__call__")

建议改为

callable(obj)

修复安全性

如果 hasattr 调用表达式中有注释,则此规则的修复被标记为不安全,因为注释可能会被删除。

例如,在以下情况下,修复将被标记为不安全

hasattr(
    # comment 1
    obj,  # comment 2
    # comment 3
    "__call__",  # comment 4
    # comment 5
)

参考