首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >方法的修饰器参数不能是基于类的静态成员的列表理解

方法的修饰器参数不能是基于类的静态成员的列表理解
EN

Stack Overflow用户
提问于 2020-04-17 12:37:29
回答 1查看 217关注 0票数 3

让我们考虑以下示例:

代码语言:javascript
复制
def dec(arg):
    def wrapper(m):
        def result(self):
            print(arg)
            m(self)
        return result
    return wrapper


class X:

    x = [7]

    @dec(x)
    def f(self):
        print('hello from f')

    @dec([i + 5 for i in x])
    def g(self):
        print('hello from g')


X().f()
X().g()

代码在我的python3.6安装下运行良好,但是pylint在装饰器的g方法参数中抱怨undefined-variable x。为什么会发生这种事?这段代码不是以这种方式实现的好主意吗?如果是的话-有其他选择吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-25 04:42:40

简短回答:--这是Pylint2.4.4(和更早版本)中的一个bug。我已经提交了一个补丁,它已经合并到主版中,并将包含在下一个版本的Pylint中。

Details (为好奇者服务):

当Python将代码解析为抽象语法树(AST)节点时,装饰节点(例如@dec...)被附加到节点的decorator_list上,用于函数定义(例如def g...):

代码语言:javascript
复制
    stmt = FunctionDef(identifier name, arguments args,
                       stmt* body, expr* decorator_list, expr? returns,
                       string? type_comment)

Pylint有函数参数(args)的特例,但忘了检查decorator_listreturns注释。这导致Pylint错误地对待装饰器,就像它们在函数中一样,因此在函数作用域中而不是类作用域中。

解决方案

作为一个静态代码检查器,Pylint只能做到这一点。它目前有500个未解决的问题,所以希望有几个错误的结果。现在,您可以按照@chepner的建议禁用Pylint警告,只针对这一行:

代码语言:javascript
复制
    @dec([i + 5 for i in x]) # pylint: disable=undefined-variable

,但我现在就想要!(对于那些不作弊的10/10代码等级的人来说)

代码语言:javascript
复制
git clone https://github.com/PyCQA/astroid.git
git clone https://github.com/PyCQA/pylint.git
pip install ./astroid/
pip install ./pylint/
pylint --version

吡啶2.5.0-dev1 星体2.4.0

对于Pylint的开发版本(以及Pylint库用于解析的Astroid ),问题中的代码不应该发出任何undefined-variable抱怨(尽管它会给出一些样式警告)。如果有任何变化,请重新打开错误报告!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61271870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档