我有以下代码:
#!/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
Run Code Online (Sandbox Code Playgroud)
pylint 产生以下错误:
tt.py:10:17: E1101: Class 'method' has no 'upper' member (no-member)
Run Code Online (Sandbox Code Playgroud)
如果我将method变量重命名为其他名称,则不会报告错误,fe 为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]
Run Code Online (Sandbox Code Playgroud)
有一种方法可以满足你的好奇心——调试。您可以pylint从同一个文件运行并跟踪其行为。
if __name__ == "__main__":
import pylint
import sys
sys.argv.append(__file__)
pylint.run_pylint()
Run Code Online (Sandbox Code Playgroud)
其实说起来容易做起来难,我已经尝试过,但无法理解到底发生了什么细节。用高级术语来说,尝试推断表达式 中pylint的类型,但无法自行完成,落入库中,并且类型推断为。显然,这个词对于 来说意味着一些特殊的东西,就像其他一些词一样。例如,如果您使用 name而不是 ,则会检测到相同的错误。methodmethod.upper()astroidmethodClassDef.methodmethodastroidE1101functionmethod
看起来它的行为在某种程度上与内置函数的名称有关,但function和method不是内置函数。我想astroid将它们视为某种类的“别名” ast,但我不确定。