是什么导致了这个神秘的 pylint E1101 错误?

les*_*nik 5 python pylint

我有以下代码:

#!/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)

Nob*_*bbs 0

有一种方法可以满足你的好奇心——调试。您可以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

看起来它的行为在某种程度上与内置函数的名称有关,但functionmethod不是内置函数。我想astroid将它们视为某种类的“别名” ast,但我不确定。