В новом выпуске pycharm (версия сообщества 3.1.3) предлагается преобразовать методы, которые не работают с текущим состоянием объекта, в static.
Какова практическая причина этого? Какая-то микро-производительность (-или-память) -оптимизация?
В новом выпуске pycharm (версия сообщества 3.1.3) предлагается преобразовать методы, которые не работают с текущим состоянием объекта, в static.
Какова практическая причина этого? Какая-то микро-производительность (-или-память) -оптимизация?
PyCharm "думает", что вы, возможно, хотели иметь статический метод, но вы забыли объявить его статичным.
PyCharm предлагает это, потому что метод не использует self
в своем теле и, следовательно, фактически не изменяет экземпляр класса. Следовательно, метод может быть статическим, то есть вызываемым без создания экземпляра класса раньше.
Согласовано с @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().
Угадает, почему это предупреждение существует:
Я могу представить следующие преимущества наличия метода класса, определенного как статический:
Остальные преимущества, вероятно, являются маргинальными, если они присутствуют вообще:
Я думаю, что причиной этого предупреждения является конфигурация в Pycharm. Вы можете снять выделение Метод может быть статичным в редакторе- > Инспекция
Это сообщение об ошибке просто помогло мне сгустком, так как я не понял, что случайно написал свою функцию, используя свой пример тестирования игрока
my_player.attributes[item]
вместо правильного пути
self.attributes[item]
Поскольку вы не ссылались на self
в теле метода bar
, PyCharm спрашивает, возможно ли, что вы хотите сделать статический текст bar
. В других языках программирования, таких как Java, есть очевидные причины для объявления статического метода. В Python единственное реальное преимущество статического метода (AFIK) можно назвать без экземпляра класса. Однако, если это единственная причина, вам, вероятно, лучше идти с функцией верхнего уровня - как отметить здесь.
Короче говоря, я не на сто процентов уверен, почему он там. Я предполагаю, что они, вероятно, удалят его в предстоящем выпуске.
Я согласен с ответами, приведенными здесь (метод не использует self
и поэтому может быть украшен @staticmethod
).
Я хотел бы добавить, что вы, возможно, захотите перенести метод на функцию верхнего уровня вместо статического метода внутри класса. Подробнее см. Этот вопрос и принятый ответ: python - следует использовать статические методы или функции верхнего уровня
Перемещение метода на функцию верхнего уровня также устранит предупреждение PyCharm.