gpt4 book ai didi

python - 是我的类内装饰器不够 Pythonic 还是 PyCharm 在 lint 警告方面不够智能?

转载 作者:太空狗 更新时间:2023-10-30 01:04:29 29 4
gpt4 key购买 nike

我想在一个类中定义一个装饰器。我不想将它定义为一个单独的、独立的函数,因为这个装饰器是专门为这个类设计的,我想把相关的方法放在一起。

这个装饰器的作用是检查一些先决条件,尤其是成员变量持有的数据库连接、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()

这是 PyCharm 报告的 lint 警告:

Lint warning reported by PyCharm

最佳答案

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

wrt/pythonicity,在不需要的时候让这个装饰器成为类的一部分确实是非Pythonic的。它仅适用于此类的事实并不是使其成为该类成员的理由,更不用说使其成为公共(public) API 的一部分了。

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

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

关于python - 是我的类内装饰器不够 Pythonic 还是 PyCharm 在 lint 警告方面不够智能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51260036/

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