Python 3.x VSCode,Python3.7:pylint自定义修饰类无成员错误

Python 3.x VSCode,Python3.7:pylint自定义修饰类无成员错误,python-3.x,visual-studio-code,pylint,Python 3.x,Visual Studio Code,Pylint,我最近将一个实例方法移出了它的类定义,并将它作为一个全局函数(例如:deco_函数)放置,以便能够在不同的类中再次使用它。有关详细说明和错误复制,请参见以下代码: def deco_function(cls): def inner_fct(self): print('do something') cls.deco_function = inner_fct return cls @deco_function class Something:

我最近将一个实例方法移出了它的类定义,并将它作为一个全局函数(例如:deco_函数)放置,以便能够在不同的类中再次使用它。有关详细说明和错误复制,请参见以下代码:

def deco_function(cls):
    
    def inner_fct(self):
        print('do something')

    cls.deco_function = inner_fct
    return cls

@deco_function
class Something:

    def __init__(self):
        print('init')
        self.deco_function()
        print('done')

if __name__ == '__main__':
    a = Something()
代码运行完全正常,可以打印

init
do something
done
但是,VSCode在self.deco_function()下划红色下划线,pylint表示实例“某物”没有“deco_function”成员

有没有办法防止pylint将其标记或使VSCode将deco_函数识别为实例成员


谢谢您的建议。

您必须使用PyLint插件来告诉运行时生成的类成员

PYTHONPATH

导入星体
来自astroid导入管理器
def寄存器(过梁):
#需要注册插件。
通过
def转换(cls):
如果不是cls.decorators:返回
如果有(映射(lambda x:x.name='deco_function',cls.decorators.nodes)):
扩展模块=astroid.parse(“”)
def装饰功能(自):
通过
""")
对于名称,扩展名_module.locals.items()中的objs:
cls.locals[name]=objs
MANAGER.register_transform(astroid.ClassDef,transform)
然后使用以下设置配置VSC

"python.linting.pylintArgs": ["--load-plugins", "pylint_decorator"]
这仅在使用
@deco_函数
语法时有效

如果调用decorator函数,PyLint将看不到decorator的用法

#插件不会捕捉到这种用法
分类:
定义初始化(自):
打印('init')
self.deco_函数()
打印(‘完成’)
某物=装饰功能(某物)

似乎还有另一个缺陷:
:在赋值Pylint之前引用了局部变量“extension\u module”(星形错误)
有什么想法吗?这个错误现在出现在我打开的任何模块中…我发现astroid也跟踪装饰器,所以不需要命名显式类如果使用命令
pylint-E--load plugins pylint decorator deco_test.py
,你会看到什么。插件中的缩进是否与提供的代码相同?我想,我在
astroid.parse()方法中的缩进是错误的。不再显示错误,但派林似乎变得更加敏感…:D很多注释。显式命令引发了一个ImportError:No模块名为'pylint\u decorator'
。这很奇怪,因为它似乎无论如何都能起作用。