Col*_*ver 5 python static-analysis lint decorator pycharm
我想在一个类中定义一个装饰器.我不想将它定义为一个独立的独立函数,因为这个装饰器专门用于这个类,我想把相关的方法保存在一起.
这个装饰器的目的是检查一些先决条件,尤其是成员变量持有的数据库连接,SSH连接等仍然可用.如果没有,则不会调用修饰函数,并且将执行一些错误报告和清理工作.
我做了以下测试类来测试它是否有效,并且代码确实运行良好.但我发现PyCharm会对这段代码发出警告.所以我想知道,如果这意味着我的代码不是Pythonic,或者PyCharm不够智能并且错误地发出了警告?
如果我的代码不是Pythonic,如何改变?如果是PyCharm的错误,我和我的团队如何配置PyCharm让它特别忽略这种警告,同时保留大部分其他lint检查?
class TestClass:
def __init__(self):
self.flag = True
def dec(func):
def wrapper(self, *args, **kwargs):
if not self.flag:
print("Won't run!")
return empty_fun(self, *args, **kwargs)
return func(self, *args, **kwargs)
def empty_fun(*args, **kwargs):
return None
return wrapper
@dec
def foo(self):
print("foo")
@dec
def bar(self, msg, more, *args, **kwargs):
print("message: %s" % msg)
print("more %s:" % more)
for item in args:
print("other item: %s" % item)
name = kwargs.get('name')
age = kwargs.get('age')
print('name: %s' % name)
print('age: %s' % age)
def main():
t = TestClass()
t.foo()
print('-'*10)
t.bar("abc", 'def', 'hij', 'klm', name='Tom', age=20)
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud)
以下是PyCharm报告的棉绒警告:
您的代码在技术上是正确的(因为它将按预期工作),但需要注意的是,该代码dec将成为一种方法TestClass,并且如果这样调用就会中断。你至少应该让它staticmethod避免这种情况。
wrt/ pythonicity,当不需要这个装饰器时将其作为类的一部分确实是不Pythonic的。它仅适用于此类这一事实并不是使其成为该类的成员的理由,更不是使其成为公共 API 的一部分的理由。
您可能可以在注释中添加 linter 提示以使其静音,但我个人只是从类中提取此装饰器,将其设为私有,并记录它仅应与此类一起使用。
作为旁注:我假设您empty_func是“错误报告和清理工作”的占位符 - 否则它只是无用 - 但它真的需要在装饰器中定义吗?
| 归档时间: |
|
| 查看次数: |
216 次 |
| 最近记录: |