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

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

введите описание изображения здесь

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 my_player.attributes[item] 

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

 self.attributes[item] 

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

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

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

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

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

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