为什么pycharm建议将方法更改为static

zer*_*kms 133 python pycharm

新的pycharm发行版(3.1.3社区版)建议将不能使用当前对象状态的方法转换为静态.

在此输入图像描述

这有什么实际的原因?某种微观性能( - 或内存) - 优化?

jol*_*lvi 150

PyCharm"认为"你可能想要一个静态方法,但你忘了声明它是静态的.

PyCharm建议这样做,因为该方法不在其体内使用 self,因此实际上不会更改类实例.因此,该方法可以是静态的,即可以在不创建类实例之前调用.

  • 很多人都回答了这种味道反应.我想补充一点,如果你知道它肯定不会是一个静态方法,那么当你在那里确定你没有完成它时不要使用它时,包括一个"抛出NotImplementedError". (4认同)
  • 我的情况是我的默认实现返回一个常量,但是允许我的子类根据`self`返回一个值。在这种情况下,该警告是可以忽略的,我将其标记为“#noinspection PyMethodMayBeStatic”。IntelliJ IDEA不提供在此警告的上下文菜单中添加此禁用注释的想法,这很可惜。 (3认同)
  • 我建议在 PyCharm 的首选项中将 PyCharm 检查的严重性从“警告”更改为“不突出显示,仅修复”。(它给我带来了很多误报。) (2认同)

Bob*_*ein 46

同意@ jolvi,@ ArundasR和其他人,警告发生在不使用的成员函数上self.

如果你确定PyCharm是错误的,那么该函数不应该是a @staticmethod,如果你重视零警告,你可以通过两种不同的方式使它消失:

解决方法#1

def bar(self):
    self.is_not_used()
    doing_something_without_self()

def is_not_used(self):
    pass
Run Code Online (Sandbox Code Playgroud)

解决方法#2 [感谢@DavidPärsson ]

# noinspection PyMethodMayBeStatic
def bar(self):
    doing_something_without_self()
Run Code Online (Sandbox Code Playgroud)

我为此所用的应用程序(我不能使用@staticmethod的原因)是创建一个处理函数表来响应协议子类型字段.所有处理程序必须是相同的形式(静态或非静态).但是有些人没有碰巧对这个实例做任何事情.如果我做了那些静态的我会得到"TypeError:'staticmethod'对象不可调用".

为了支持OP的惊愕,建议你尽可能地添加静态方法,违背以后更容易使代码更少限制的原则,而不是使其更多 - 使方法静态使其现在的限制性更小,因为你可以调用class.f()而不是instance.f().

猜测为什么存在此警告:

  • 宣传staticmethod.它使开发人员意识到他们可能有意的事情.
  • 正如@ JohnWorrall指出的那样,当自我被无意中排除在功能之外时,它会引起你的注意.
  • 这是重新思考对象模型的一个提示; 也许这个功能完全不属于这个类.

  • 在方法或类之上添加`#noinspection PyMethodMayBeStatic`会抑制警告,在我看来比调用空方法更好. (4认同)
  • @Talha:Python3 中根本没有删除`self`。 (2认同)

小智 11

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

  • 我的问题是为什么甚至存在这样的检查.我知道我可以关掉它.对不起,不是答案. (9认同)

Jan*_*sky 7

我可以想象将类方法定义为静态方法的优点:

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

如果存在,剩余的优势可能是微不足道的:

  • 可能运行得更快
  • 节省一点内存

  • 是的。但问题是 - 我没有将其用作静态方法。否则它就已经是静态的了。所以 PyCharm 建议这样做,没有充分的理由(?)。“如果存在的话,剩余的优势可能也是微乎其微的”——是的,没错。但如果是这样的话——这是来自 PyCharm 的愚蠢建议 (3认同)
  • 静态方法是构建优秀软件的敌人。它们使许多原则无效,因此“位”运行得更快并不是重点(因为它们在 ram 中运行,因此在两种情况下都很快),而且如您所知,计算机现在拥有“一堆”内存,因此这不再是问题。还要注意您的第一个想法:这是一种程序行为,而不是面向对象的行为。 (3认同)

tlo*_*tlo 7

我同意此处给出的答案(方法未使用self,因此可以用修饰@staticmethod)。

我想补充一点,您可能希望将方法移至顶级函数,而不是将类中的静态方法移至该函数。有关详细信息,请参见此问题和可接受的答案:python-我应该使用静态方法还是顶层函数

将方法移至顶层函数也将修复PyCharm警告。


Jun*_*uxx 7

这可能有点混乱,但有时您只是不需要访问self,但您更愿意将该方法保留在类中而不是使其静态。或者您只是想避免添加一堆难看的装饰器。以下是针对这种情况的一些潜在解决方法。

如果您的方法只有副作用并且您不关心它返回什么:

def bar(self):
    doing_something_without_self()
    return self
Run Code Online (Sandbox Code Playgroud)

如果您确实需要返回值:

def bar(self):
    result = doing_something_without_self()
    if self:
        return result
Run Code Online (Sandbox Code Playgroud)

现在您的方法正在使用self,并且警告消失了!