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

时间:2021-03-13 13:48:51

标签: 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

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]

1 个答案:

答案 0 :(得分:0)

有一种方法可以满足您的好奇心 - 调试。 您可以从同一文件运行 pylint 并跟踪其行为。

if __name__ == "__main__":
    import pylint
    import sys
    sys.argv.append(__file__)
    pylint.run_pylint()

实际上说起来容易做起来难,我试过了,但无法详细了解到底发生了什么。在高级术语中,pylint 试图推断表达式 methodmethod.upper() 的类型,但无法自行推断,落入 astroid 库中,并且 method {1}} 类型推断为 ClassDef.method。显然,method 这个词对于 astroid 来说意味着一些特殊的东西,就像其他一些词一样。例如,如果您使用名称 E1101 而不是 function,则会检测到相同的 method 错误。

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