¿Por qué PyCharm propone cambiar el método a estático?

8 minutos de lectura

avatar de usuario
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.

ingrese la descripción de la imagen aquí

¿Cuál es la razón práctica de eso? ¿Algún tipo de optimización de micro-rendimiento (o memoria)?

  • @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

avatar de usuario
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


avatar de usuario
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 @staticmethody 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:

  • Eso anuncia el método estático. Hace que los desarrolladores sean conscientes de algo que bien pueden haber pretendido.
  • Como señala @JohnWorrall, llama tu atención cuando el yo fue dejado de lado sin darse cuenta de la función
  • Es una señal para repensar el modelo de objetos; quizás la función no pertenece en esta clase en absoluto.

  • “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


avatar de usuario
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

avatar de usuario
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:

  • puede llamar al método simplemente usando el nombre de la clase, no es necesario crear una instancia.

las ventajas restantes son probablemente marginales, si es que están presentes:

  • podría correr un poco más rápido
  • guarda un poco de memoria

  • 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


avatar de usuario
Junuxx

Puede ser un poco complicado, pero a veces simplemente no necesita acceder selfpero 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 selfy 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


avatar de usuario
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.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad