方法的装饰器参数不能是基于 class' 静态成员的列表理解
Method's decorator parameter cannot be a list comprehension based on class' static member
让我们考虑以下示例:
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
。为什么会这样?这段代码不是以这种方式实现的好主意吗?如果是这样 - 还有其他选择吗?
简短回答:这是 Pylint 2.4.4(及更早版本)中的错误。 I've submitted a patch,已合并到master中,将包含在Pylint的下一个版本中。
详细信息(好奇的):
当Python将代码解析成抽象语法树(AST)个节点时,装饰器节点(例如@dec...
)附加到函数节点的decorator_list
定义(例如 def g...
):
stmt = FunctionDef(identifier name, arguments args,
stmt* body, expr* decorator_list, expr? returns,
string? type_comment)
Pylint 有函数参数的特殊情况 (args
),但忘记检查 decorator_list
和 returns
注释。这导致 Pylint 错误地将装饰器视为在函数内部,因此在函数范围内而不是 class 范围内。
解决方法:
作为静态代码检查器,Pylint 也只能到此为止了。它目前有 500 个未解决的问题,所以预计会有一些误报。现在,您可以按照 @chepner 的建议禁用 Pylint 警告,仅针对该行:
@dec([i + 5 for i in x]) # pylint: disable=undefined-variable
但我现在想要它!(对于那些想要 10/10 代码评级而不作弊的人)
git clone https://github.com/PyCQA/astroid.git
git clone https://github.com/PyCQA/pylint.git
pip install ./astroid/
pip install ./pylint/
pylint --version
pylint 2.5.0-dev1
astroid 2.4.0
使用 Pylint 的开发版本(以及 Pylint 用于解析的库 Astroid),问题中的代码不应给出任何 undefined-variable
投诉(尽管它会给出一些样式警告)。如果这有任何变化,请重新打开错误报告!
让我们考虑以下示例:
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
。为什么会这样?这段代码不是以这种方式实现的好主意吗?如果是这样 - 还有其他选择吗?
简短回答:这是 Pylint 2.4.4(及更早版本)中的错误。 I've submitted a patch,已合并到master中,将包含在Pylint的下一个版本中。
详细信息(好奇的):
当Python将代码解析成抽象语法树(AST)个节点时,装饰器节点(例如@dec...
)附加到函数节点的decorator_list
定义(例如 def g...
):
stmt = FunctionDef(identifier name, arguments args,
stmt* body, expr* decorator_list, expr? returns,
string? type_comment)
Pylint 有函数参数的特殊情况 (args
),但忘记检查 decorator_list
和 returns
注释。这导致 Pylint 错误地将装饰器视为在函数内部,因此在函数范围内而不是 class 范围内。
解决方法:
作为静态代码检查器,Pylint 也只能到此为止了。它目前有 500 个未解决的问题,所以预计会有一些误报。现在,您可以按照 @chepner 的建议禁用 Pylint 警告,仅针对该行:
@dec([i + 5 for i in x]) # pylint: disable=undefined-variable
但我现在想要它!(对于那些想要 10/10 代码评级而不作弊的人)
git clone https://github.com/PyCQA/astroid.git
git clone https://github.com/PyCQA/pylint.git
pip install ./astroid/
pip install ./pylint/
pylint --version
pylint 2.5.0-dev1
astroid 2.4.0
使用 Pylint 的开发版本(以及 Pylint 用于解析的库 Astroid),问题中的代码不应给出任何 undefined-variable
投诉(尽管它会给出一些样式警告)。如果这有任何变化,请重新打开错误报告!