Why does pycharm propose to change method to static
新的Pycharm版本(3.1.3社区版)建议将不适用于当前对象状态的方法转换为静态方法。
实际原因是什么?某种微性能(或内存)优化?
- 你点击"更多…"了吗?您是否在方法内的任何地方引用了self?(如果问题真的是"为什么Pycharm的设计师会这样设计它…"你得问他们,不是这样……)
- @Wooble:该方法有一个单行的实现。"更多"不包含任何有用的内容
Pycharm"认为"您可能想要一个静态方法,但您忘记了将其声明为静态方法。
Pycharm提出这一点是因为该方法在其主体中不使用self,因此实际上并不更改类实例。因此,该方法可以是静态的,也就是说,可以在没有创建类实例的情况下调用。
- 这么多人用这种味道的反应来回答。不过,我想补充一点,如果你知道它肯定不会是一个静态方法,那么在你确定不完成它就不使用它的时候,加入一个"throw-notimplementederror"。
- 在某些情况下,Pycharm的警告是不合理的,因为我们既不希望使用静态方法,也不希望更改状态。另一方面,如果方法还没有实现,那么提出一个NotImplementedError似乎总是一个好主意。
- 我的默认实现返回一个常量,但是我的子类可以根据self返回一个值。在这种情况下,警告是可以忽略的,我用# noinspection PyMethodMayBeStatic标记它。Intellij的想法并没有在上下文菜单中为这个警告添加这个禁用的注释,这是一个小问题。
- 我建议在Pycharm的偏好中,将这种Pycharm检查的严重性从"警告"改为"不突出显示,只修复"。(这给我带来了很多误报。)
与@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所指出的,当自我无意中被排除在功能之外时,它会引起你的注意。
- 这是重新考虑对象模型的提示;也许函数根本不属于这个类。
- "使一个方法静态化,现在就不那么具有限制性了"——它完全没有。例如:多态方法
- 我认为最后一点需要重复:"当它显然是一个函数时,为什么要使它成为一个方法?"将真正需要实例的内容与处理某些方面的结构内容分开。然后您可以很容易地将其细分为单独的模块。
- @在你想出一个合理的例外之前,所有的规则都是美好的。我描述了一个,一个回调列表。
- @bobstein-visibone如果他们不使用实例变量,那么为什么不使用模块进行分组呢?当然,有时候静态的方法适合这个故事,这就是它存在的原因,但我认为你的这一点很重要。
- 我觉得《Pycharm》的这一特点很有帮助,我强烈同意最后一点。使用不引用自身的非静态类方法是代码味道。
- 在方法或类的上面添加EDOCX1[4]会抑制警告,我认为这比调用空方法要好。
- 同意@david&rsson,作为解决方案添加到答案中。我今天就是这么做的。保持1,因为它稍微不那么神秘。读者可以选择。
- 只是增加了我的想法,我使用的是python 3,self已经被删除了,所以为什么pycharm仍然给出这些警告?我猜林特还在瞄准2.x版。
我认为这个警告的原因是Pycharm中的config。您可以取消选中"编辑器"->"检查"中的"选择方法可能是静态的"
- 我的问题是,为什么会有这样的检查。我知道我可以关掉它。对不起,没有答案。
我可以想象拥有一个定义为静态方法的类方法有以下优点:
如果有的话,其余的优势可能是微乎其微的:
- 是的。但问题是-我没有把它当作静态方法。否则它就已经是静态的了。所以Pycharm建议不带任何理由去做这件事(?)"如果有的话,其余的优势可能是微不足道的"——没错。但如果是这样的话-那是Pycharm的愚蠢建议
- @Zerkms这就是它如何与一些迷人的实例相匹配的方式:—)
- 静态方法是构建好软件的敌人。他们废除了许多原则,所以bit运行得更快不是关键(因为它们在RAM中运行得很快),正如你所知,计算机现在有bunch的内存,所以这不再是问题了。还要注意您的第一个想法:这是一种过程行为,而不是面向对象的行为。
我同意这里给出的答案(方法不使用self,因此可以用@staticmethod装饰)。
我想补充一点,您可能希望将方法移动到顶级函数,而不是类中的静态方法。有关详细信息,请参阅这个问题和公认的答案:python-我应该使用静态方法还是顶级函数
将方法移动到顶级函数也将修复pycharm警告。
由于你没有在bar方法体中提到self,pycharm会问你是否想让bar静态化。在其他编程语言(如Java)中,声明静态方法有明显的理由。在Python中,静态方法(afik)唯一真正的好处是能够在没有类实例的情况下调用它。然而,如果这是你唯一的原因,那么你最好使用一个顶级的功能——如这里的注释所示。
简言之,我不能百分之百地确定它为什么会在那里。我猜他们可能会在即将发布的版本中删除它。
这个错误消息只是帮了我很多忙,因为我还没有意识到我不小心用我的测试示例播放器编写了我的函数。
1
| my_player.attributes[item] |
而不是正确的方式