La nueva versión de pycharm (edición comunitaria 3.1.3) propone convertir los métodos que no funcionan con el estado actual del objeto en estáticos.
¿Cuál es la razón práctica de eso? ¿Algún tipo de optimización de micro-rendimiento (o memoria)?
zerkms
La nueva versión de pycharm (edición comunitaria 3.1.3) propone convertir los métodos que no funcionan con el estado actual del objeto en estáticos.
¿Cuál es la razón práctica de eso? ¿Algún tipo de optimización de micro-rendimiento (o memoria)?
jolvi
PyCharm “piensa” que podrías tener querido tener un método estático, pero olvidó declararlo como estático (usando el método @staticmethod
decorador).
PyCharm propone esto porque el método no usar self
en su cuerpo y por lo tanto en realidad no cambiar la instancia de clase. Por lo tanto, el método podría ser estático, es decir, invocable sin pasar una instancia de clase o incluso sin haber creado una instancia de clase.
Muchas personas han respondido con esta respuesta de sabor. Sin embargo, agregaría, si sabe que definitivamente no será un método estático, entonces incluya un “lanzar NotImplementedError” mientras esté allí para asegurarse de no usarlo sin completarlo.
– Ricardo Verde
3 de agosto de 2015 a las 14:33
Puede haber casos en los que la advertencia de PyCharm no esté justificada porque no queremos un método estático ni cambiar el estado. Por otro lado, si el método aún no está implementado, siempre parece una buena idea plantear una NotImplementedError
.
– jolvi
25/10/2016 a las 22:51
Tengo el caso de que mi implementación predeterminada devuelve una constante, pero mis subclases pueden devolver un valor dependiendo de self
. En este caso la advertencia es despreciable, y la marco con # noinspection PyMethodMayBeStatic
. Es una pena que IntelliJ IDEA no ofrezca agregar este comentario de desactivación en los menús contextuales para esta advertencia.
– Alfé
3 de diciembre de 2018 a las 0:52
Sugiero cambiar la gravedad de esta inspección de PyCharm de “Advertencia” a “Sin resaltar, solo corregir” en las preferencias de PyCharm. (Me está produciendo muchos falsos positivos).
– maciek
7 de marzo de 2019 a las 14:43
bob stein
De acuerdo con @jolvi, @ArundasR y otros, la advertencia ocurre en una función miembro que no usa self
.
Si está seguro de que PyCharm está mal, que la función no debería ser una @staticmethod
y si valoras cero advertencias, puedes hacer que esta desaparezca de dos maneras diferentes:
Solución #1
def bar(self):
self.is_not_used()
doing_something_without_self()
def is_not_used(self):
pass
Solución #2 [Thanks @DavidPärsson]
# noinspection PyMethodMayBeStatic
def bar(self):
doing_something_without_self()
La aplicación que tenía para esto (la razón por la que no podía usar @staticmethod) era hacer una tabla de funciones de controlador para responder a un campo de subtipo de protocolo. Todos los controladores tenían que tener la misma forma, por supuesto (estáticos o no estáticos). Pero algunos no hicieron nada con la instancia. Si los hiciera estáticos, obtendría “TypeError: el objeto ‘staticmethod’ no se puede llamar”.
En apoyo de la consternación del OP, sugerir que agregue un método estático siempre que pueda, va en contra del principio de que es más fácil hacer que el código sea menos restrictivo más adelante que hacerlo más: hacer que un método sea estático lo hace menos restrictivo ahora, ya que puede llama a class.f() en lugar de a instance.f().
Adivina por qué existe esta advertencia:
“hacer que un método sea estático lo hace menos restrictivo ahora” — no lo hace en absoluto. Ej: métodos polimórficos
– zerkms
03/08/2015 a las 19:22
Creo que vale la pena repetir el último punto: “¿por qué lo conviertes en un método, cuando claramente es una función?” Mantenga las cosas que realmente necesitan una instancia separadas de las cosas estructurales que se ocupan de algún aspecto. Luego puede subdividirlo fácilmente en un módulo separado.
– dhill
19 de noviembre de 2015 a las 9:30
agregando # noinspection PyMethodMayBeStatic
sobre el método o la clase suprime la advertencia y, en mi opinión, es mejor que llamar a un método vacío.
– David Parsson
3 de mayo de 2017 a las 9:54
@Talha: self
no se elimina en Python3 en absoluto.
– Junuxx
31 de mayo de 2019 a las 0:08
@Talha, no entiendo tu punto. No puedo pensar en ninguna manera de que self
en Python 2 no sería necesario en Python 3. ¿Puede dar un ejemplo o enlace?
–Bob Stein
19 de junio de 2019 a las 14:20
mincom
Creo que el motivo de esta advertencia es la configuración en Pycharm. Puede desmarcar la selección El método puede ser estático en Editor->Inspección
Mi pregunta era por qué existe tal inspección. Entiendo que puedo apagarlo. Lo siento, no es una respuesta.
– zerkms
21 de junio de 2016 a las 22:58
No la respuesta a la pregunta pero muy útil, gracias!
– Sr. B.
27 de marzo de 2021 a las 13:02
tlo
Estoy de acuerdo con las respuestas dadas aquí (el método no usa self
y por lo tanto podría ser decorado con @staticmethod
).
Me gustaría agregar que tal vez desee mover el método a una función de nivel superior en lugar de un método estático dentro de una clase. Para obtener más información, consulte esta pregunta y la respuesta aceptada: python: ¿debería usar métodos estáticos o funciones de nivel superior?
Mover el método a una función de nivel superior también corregirá la advertencia de PyCharm.
Puedo imaginar las siguientes ventajas de tener un método de clase definido como estático:
las ventajas restantes son probablemente marginales, si es que están presentes:
Sí. Pero la cuestión es que no lo estoy usando como un método estático. De lo contrario ya sería estático. Entonces PyCharm aconseja hacerlo sin una buena razón (?). “Las ventajas restantes son probablemente marginales, si es que están presentes” — sí, exactamente. Pero si es el caso, es un consejo tonto de PyCharm
– zerkms
9 de mayo de 2014 a las 0:43
@zerkms así es como funciona con algunos casos encantadores 🙂
– Jan Vlcinski
9 de mayo de 2014 a las 0:46
Los métodos estáticos son un enemigo para construir un buen software. Anulan muchos principios por lo que el bit
correr más rápido no es el punto (porque se ejecutan en ram, por lo que es rápido en ambos casos) y, como saben, las computadoras ahora tienen bunch
de memoria para que eso ya no sea un problema. También tenga en cuenta su primer pensamiento: ese es un comportamiento de procedimiento, no orientado a objetos.
– Amir Hossein
15 de diciembre de 2017 a las 13:45
Junuxx
Puede ser un poco complicado, pero a veces simplemente no necesita acceder self
pero preferiría mantener el método en la clase y no hacerlo estático. O simplemente desea evitar agregar un montón de decoradores antiestéticos. Aquí hay algunas posibles soluciones para esa situación.
Si su método solo tiene efectos secundarios y no le importa lo que devuelve:
def bar(self):
doing_something_without_self()
return self
Si necesita el valor de retorno:
def bar(self):
result = doing_something_without_self()
if self:
return result
Ahora tu método está usando self
y la advertencia desaparece!
Sí. Pero la cuestión es que no lo estoy usando como un método estático. De lo contrario ya sería estático. Entonces PyCharm aconseja hacerlo sin una buena razón (?). “Las ventajas restantes son probablemente marginales, si es que están presentes” — sí, exactamente. Pero si es el caso, es un consejo tonto de PyCharm
– zerkms
9 de mayo de 2014 a las 0:43
@zerkms así es como funciona con algunos casos encantadores 🙂
– Jan Vlcinski
9 de mayo de 2014 a las 0:46
Los métodos estáticos son un enemigo para construir un buen software. Anulan muchos principios por lo que el bit
correr más rápido no es el punto (porque se ejecutan en ram, por lo que es rápido en ambos casos) y, como saben, las computadoras ahora tienen bunch
de memoria para que eso ya no sea un problema. También tenga en cuenta su primer pensamiento: ese es un comportamiento de procedimiento, no orientado a objetos.
– Amir Hossein
15 de diciembre de 2017 a las 13:45
Comunidad
Como no te referiste self
en el bar
cuerpo del método, PyCharm le pregunta si puede que he querido hacer bar
estático. En otros lenguajes de programación, como Java, existen razones obvias para declarar un método estático. En Python, el único beneficio real de un método estático (AFIK) es poder llamarlo sin una instancia de la clase. Sin embargo, si esa es su única razón, probablemente sea mejor que elija una función de nivel superior, como se indica aquí.
En resumen, no estoy cien por ciento seguro de por qué está ahí. Supongo que probablemente lo eliminarán en una próxima versión.
@Wooble: hay
return 1
como una implementación de una sola línea del método. “Más” no contiene nada útil– zerkms
9 de mayo de 2014 a las 0:49