CodeQL 文档

不可调用对象被调用

ID: py/call-to-non-callable
Kind: problem
Security severity: 
Severity: error
Precision: high
Tags:
   - reliability
   - correctness
   - types
Query suites:
   - python-security-and-quality.qls

点击查看 CodeQL 代码库中的查询

如果调用了一个对象,obj(),则该对象必须是可调用的,否则将引发 TypeError。可调用对象是指其类定义了 __call__ 特殊方法的任何对象。可调用对象包括函数、方法、类。

内置函数 callable(object) 用于确定一个对象是否可调用。

当 Python 解释器尝试评估诸如 func(arg) 这样的调用时,它将在 func 上调用 __call__ 特殊方法。因此,func(arg) 大致等同于 type(func).__call__(func, arg),这意味着该必须定义属性 __call__,仅仅将其添加到实例中是不够的。

建议

由于这个问题通常表明逻辑错误,因此无法给出修复它的通用方法。

示例

list 不是可调用的。在本例中,尝试调用 list 会失败,并引发 TypeError

a_list = []
a_list()

参考

  • ©GitHub, Inc.
  • 条款
  • 隐私