gpt4 book ai didi

python - 如何让 pylint 通过 astroid 识别变量

转载 作者:行者123 更新时间:2023-12-01 03:50:49 28 4
gpt4 key购买 nike

我正在尝试“教”pylint 识别成员函数,我的场景可以简化为以下内容:

主模块:a.py

from plugins import plu

class FooClass(object):
def bar(self):
self.plu.foo("asdasd")

if __name__ == '__main__':
a = FooClass()
for plugin_name, plugin in plu.plugins.items():
setattr(a, plugin_name, plugin())
a.bar()

插件文件夹文件plu.py:

plugins = {}
class Plugin(object):
def foo(self, arg):
print("bar %s" % arg)

plugins['plu'] = Plugin

插件注册自身和其他一些方法的想法是在 FooClass 对象上“引入”它们。

a.py 的输出是:

bar asdasd

(如预期)

运行pylint -E a.py 会产生以下错误:

pylint  -E a.py 
************* Module a
E: 5, 8: Instance of 'FooClass' has no 'plu' member (no-member)

我尝试编写以下 pylint-plugin:

import astroid
from astroid import nodes


def transform_test_class(mod):
if mod.name != 'a':
return
foo_cls = mod.lookup('FooClass')[1]
plugin_cls_def = astroid.MANAGER.ast_from_module_name('plugins.plu')
foo_cls[0].locals['plu'] = plugin_cls_def.lookup('Plugin')[1]


def register(linter):
astroid.MANAGER.register_transform(nodes.Module, transform_test_class)

运行pylint --load-plugins=$(pwd)/pylint-plugin -E a.py的输出是:

************* Module a
E: 5, 8: No value for argument 'arg' in unbound method call (no-value-for-parameter)

从错误中我怀疑我以某种方式错误地引入了属性,因为 pylint 认为方法 foo 是无界的,但它确实是有界的。我需要找到一种方法来告诉 pylint foo_cls[0].locals['plu'] 实际上是类 Plugin 的实例,而不是类本身。知道如何实现这一点吗?

最佳答案

将插件类添加到 FooClass 的局部变量时,您需要实例化该插件类。因此,将此行 foo_cls[0].locals['plu'] = plugin_cls_def.lookup('Plugin')[1] 替换为 foo_cls[0].locals['plu'] = [plugin_cls_def.lookup('Plugin')[1]中cls的cls.instantiate_class()]

关于python - 如何让 pylint 通过 astroid 识别变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38292993/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com