我有以下代码:
#!/usr/bin/env python
"""pylint behavior test"""
def autodetect_method(method, data):
"""autodetect method"""
if not method:
method = 'POST' if data else 'GET'
else:
method = method.upper()
return method
pylint
产生以下错误:
tt.py:10:17: E1101: Class 'method' has no 'upper' member (no-member)
如果我将 method
变量重命名为其他名称,则不会报告错误,例如到method_name
!
所以,我知道几种方法来摆脱这个错误信息。但是我很好奇变量名method
有什么特别之处,为什么会产生错误?
以防万一这个问题是特定于版本的,我的版本是:
$ pylint --version
pylint 2.4.4
astroid 2.3.3
Python 3.8.5 (default, Jan 27 2021, 15:41:15)
[GCC 9.3.0]
答案 0 :(得分:0)
有一种方法可以满足您的好奇心 - 调试。
您可以从同一文件运行 pylint
并跟踪其行为。
if __name__ == "__main__":
import pylint
import sys
sys.argv.append(__file__)
pylint.run_pylint()
实际上说起来容易做起来难,我试过了,但无法详细了解到底发生了什么。在高级术语中,pylint
试图推断表达式 method
中 method.upper()
的类型,但无法自行推断,落入 astroid
库中,并且 method
{1}} 类型推断为 ClassDef.method
。显然,method
这个词对于 astroid
来说意味着一些特殊的东西,就像其他一些词一样。例如,如果您使用名称 E1101
而不是 function
,则会检测到相同的 method
错误。
看起来它的行为在某种程度上与内置的名称有关,但 function
和 method
不是内置的。如果 astroid
类的“别名”,我想 ast
会将它们视为某种类型,但我不确定。