我的课堂装饰师不是Pythonic还是PyCharm在皮棉警告中不够聪明?

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报告的棉绒警告:

PyCharm报道了皮棉警告

bru*_*ers 3

您的代码在技术上是正确的(因为它将按预期工作),但需要注意的是,该代码dec将成为一种方法TestClass,并且如果这样调用就会中断。你至少应该让它staticmethod避免这种情况。

wrt/ pythonicity,当不需要这个装饰器时将其作为类的一部分确实是不Pythonic的。它仅适用于此类这一事实并不是使其成为该类的成员的理由,更不是使其成为公共 API 的一部分的理由。

您可能可以在注释中添加 linter 提示以使其静音,但我个人只是从类中提取此装饰器,将其设为私有,并记录它仅应与此类一起使用。

作为旁注:我假设您empty_func是“错误报告和清理工作”的占位符 - 否则它只是无用 - 但它真的需要在装饰器中定义吗?