Почему pycharm предлагает изменить метод на статический

В новом выпуске pycharm (версия сообщества 3.1.3) предлагается преобразовать методы, которые не работают с текущим состоянием объекта, в static.

enter image description here

Какова практическая причина этого? Какая-то микро-производительность (-или-память) -оптимизация?

Ответ 1

PyCharm "думает", что вы, возможно, хотели иметь статический метод, но вы забыли объявить его статичным.

PyCharm предлагает это, потому что метод не использует self в своем теле и, следовательно, фактически не изменяет экземпляр класса. Следовательно, метод может быть статическим, то есть вызываемым без создания экземпляра класса раньше.

Ответ 2

Согласовано с @jolvi, @ArundasR и другими, предупреждение происходит в функции-члене, которая не использует self.

Если вы уверены, что PyCharm ошибается, функция не должна быть @staticmethod, и если вы выставляете нулевые предупреждения, вы можете сделать это один из двух способов:

Обходной путь № 1

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

def is_not_used(self):
    pass

Обходной путь # 2 [Спасибо @DavidPärsson]

# noinspection PyMethodMayBeStatic
def bar(self):
    doing_something_without_self()

Приложение, которое у меня было для этого (причина, по которой я не мог использовать @staticmethod), заключалась в создании таблицы обработчиков для ответа на поле подтипа протокола. Все обработчики должны быть одинаковой формы (статические или нестатические). Но некоторым не удалось ничего сделать с этим экземпляром. Если бы я сделал эти статические, я бы получил "TypeError: объект staticmethod" не может быть вызван ".

В поддержку беспокойства OP, предлагая вам добавлять staticmethod всякий раз, когда вы можете, идет против принципа , что легче сделать код менее ограничительным позже, чем сделать его more - создание метода static делает его менее строгим, поскольку вы можете вызывать class.f() вместо instance.f().

Угадает, почему это предупреждение существует:

  • Он рекламирует staticmethod. Это заставляет разработчиков осознавать то, что они могли бы намереваться.
  • Как указывает @JohnWorrall, это привлекает ваше внимание, когда я был случайно оставлен этой функции.
  • Это река для переосмысления объектной модели; возможно, функция не принадлежит в этом классе вообще.

Ответ 3

Я могу представить следующие преимущества наличия метода класса, определенного как статический:

  • вы можете вызвать метод, просто используя имя класса, не нужно его создавать.

Остальные преимущества, вероятно, являются маргинальными, если они присутствуют вообще:

  • может работать немного быстрее
  • сохранить немного памяти

Ответ 4

Я думаю, что причиной этого предупреждения является конфигурация в Pycharm. Вы можете снять выделение Метод может быть статичным в редакторе- > Инспекция

Ответ 5

Это сообщение об ошибке просто помогло мне сгустком, так как я не понял, что случайно написал свою функцию, используя свой пример тестирования игрока

my_player.attributes[item] 

вместо правильного пути

self.attributes[item]

Ответ 6

Поскольку вы не ссылались на self в теле метода bar, PyCharm спрашивает, возможно ли, что вы хотите сделать статический текст bar. В других языках программирования, таких как Java, есть очевидные причины для объявления статического метода. В Python единственное реальное преимущество статического метода (AFIK) можно назвать без экземпляра класса. Однако, если это единственная причина, вам, вероятно, лучше идти с функцией верхнего уровня - как отметить здесь.

Короче говоря, я не на сто процентов уверен, почему он там. Я предполагаю, что они, вероятно, удалят его в предстоящем выпуске.

Ответ 7

Я согласен с ответами, приведенными здесь (метод не использует self и поэтому может быть украшен @staticmethod).

Я хотел бы добавить, что вы, возможно, захотите перенести метод на функцию верхнего уровня вместо статического метода внутри класса. Подробнее см. Этот вопрос и принятый ответ: python - следует использовать статические методы или функции верхнего уровня

Перемещение метода на функцию верхнего уровня также устранит предупреждение PyCharm.