【问题标题】:What causes this mysterious pylint E1101 error?是什么导致了这个神秘的 pylint E1101 错误?
【发布时间】:2021-03-13 13:48:51
【问题描述】:

我有以下代码:

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

【问题讨论】:

    标签: python pylint


    【解决方案1】:

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

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

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

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

    【讨论】: