关于python:为什么pycharm建议将方法改为static

Why does pycharm propose to change method to static

新的Pycharm版本(3.1.3社区版)建议将不适用于当前对象状态的方法转换为静态方法。

enter image description here

实际原因是什么?某种微性能(或内存)优化?


Pycharm"认为"您可能想要一个静态方法,但您忘记了将其声明为静态方法。

Pycharm提出这一点是因为该方法在其主体中不使用self,因此实际上并不更改类实例。因此,该方法可以是静态的,也就是说,可以在没有创建类实例的情况下调用。


与@jolvi、@arundar和其他人达成一致,警告发生在不使用self的成员函数上。

如果您确定pycharm是错误的,那么函数就不应该是@staticmethod,如果您将警告值设为零,那么可以使用两种不同的方法:

解决办法1

1
2
3
4
5
6
def bar(self):
    self.is_not_used()
    doing_something_without_self()

def is_not_used(self):
    pass

解决方法2[谢谢@david?RSSON]

1
2
3
# noinspection PyMethodMayBeStatic
def bar(self):
    doing_something_without_self()

为此,我拥有的应用程序(我不能使用@staticmethod的原因)正在生成一个处理程序函数表以响应协议子类型字段。所有处理程序都必须是相同的形式(静态或非静态)。但有些人并没有对这个实例做任何事情。如果我将这些设置为静态的,我将得到"typeerror:'staticmethod'对象不可调用"。

为了支持OP的惊愕,建议您尽可能地添加StaticMethod,这违背了一个原则,即在以后使代码的限制性更低,而不是使代码的限制性更强——使一个方法成为静态的会使它现在的限制性更低,因为您可以调用class.f()而不是instance.f()。

猜测此警告存在的原因:

  • 介绍了静态方法。它使开发人员意识到他们很可能已经打算好了。
  • 正如@johnworrall所指出的,当自我无意中被排除在功能之外时,它会引起你的注意。
  • 这是重新考虑对象模型的提示;也许函数根本不属于这个类。


我认为这个警告的原因是Pycharm中的config。您可以取消选中"编辑器"->"检查"中的"选择方法可能是静态的"


我可以想象拥有一个定义为静态方法的类方法有以下优点:

  • 您可以只使用类名调用方法,不需要实例化它。

如果有的话,其余的优势可能是微乎其微的:

  • 可能跑得快一点
  • 节省一点内存


我同意这里给出的答案(方法不使用self,因此可以用@staticmethod装饰)。

我想补充一点,您可能希望将方法移动到顶级函数,而不是类中的静态方法。有关详细信息,请参阅这个问题和公认的答案:python-我应该使用静态方法还是顶级函数

将方法移动到顶级函数也将修复pycharm警告。


由于你没有在bar方法体中提到self,pycharm会问你是否想让bar静态化。在其他编程语言(如Java)中,声明静态方法有明显的理由。在Python中,静态方法(afik)唯一真正的好处是能够在没有类实例的情况下调用它。然而,如果这是你唯一的原因,那么你最好使用一个顶级的功能——如这里的注释所示。

简言之,我不能百分之百地确定它为什么会在那里。我猜他们可能会在即将发布的版本中删除它。


这个错误消息只是帮了我很多忙,因为我还没有意识到我不小心用我的测试示例播放器编写了我的函数。

1
my_player.attributes[item]

而不是正确的方式

1
self.attributes[item]