programing

PyCharm은 왜 방법을 정적으로 바꾸려고 제안합니까?

kingscode 2022. 10. 8. 17:05
반응형

PyCharm은 왜 방법을 정적으로 바꾸려고 제안합니까?

새로운 pycharm 릴리즈(3.1.3 커뮤니티 에디션)에서는 현재 오브젝트의 상태와 함께 동작하지 않는 메서드를 스태틱으로 변환할 것을 제안하고 있습니다.

여기에 이미지 설명 입력

그것에 대한 실질적인 이유는 무엇입니까?마이크로 퍼포먼스(또는 메모리) 최적화 같은 거요?

PyCharm은 스태틱 방식을 사용하고 싶었을 가능성이 있다고 생각합니다만, 스태틱 방식이라고 선언하는 것을 잊었습니다(스태틱 방식 사용).@staticmethod★★★★★★★★★★★★★★★★★★」

PyCharm은 이 방법을 사용하지 않기 때문에 이 방법을 제안합니다. self클래스 인스턴스는 실제로 변경되지 않습니다.따라서 메서드는 정적일 수 있습니다. 즉, 클래스 인스턴스를 전달하지 않고 또는 클래스 인스턴스를 생성하지 않고 호출할 수 있습니다.

, @ArundasR과 합의하여 @jolvi, @ArundasR을 않는 발생합니다.self.

것이 는 PyCharm이 .@staticmethod경고 값이 0인 경우 다음 두 가지 방법으로 경고 값을 해제할 수 있습니다.

회피책 #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를 사용할 수 없었던 이유)은 protocol 서브타입 필드에 응답하기 위한 핸들러 함수 테이블을 만드는 것이었습니다.모든 핸들러는 동일한 형식(스태틱 또는 비스태틱)이어야 합니다.하지만 어떤 사람들은 그 인스턴스로 아무것도 하지 않았다.이러한 스태틱을 설정하면 "TypeError: 'staticmethod' object is not callable"이라고 표시됩니다.

OP의 경악감을 지지하기 위해 가능한 한 static 메서드를 추가하는 것은 코드를 나중에 덜 제한적으로 만드는 것이 더 쉽다는 원칙에 위배됩니다. 즉, 메서드를 static하게 만드는 것은 클래스를 호출할 수 있기 때문입니다.instance.f가 아닌 f()입니다.

이 경고가 존재하는 이유를 추측합니다.

  • 스태틱 방식을 어드버타이즈 합니다.그것은 개발자들이 그들이 의도했을지도 모르는 무언가를 깨닫게 한다.
  • @JohnWorrall이 지적한 것처럼, 본인은 부주의로 기능에서 제외되었을 때 주의를 끌게 됩니다.
  • 오브젝트 모델을 재고하기 위한 힌트입니다.함수가 이 클래스에 전혀 속하지 않을 수도 있습니다.

이 경고의 이유는 Pycharm 설정 때문이라고 생각합니다.[ Editor - > Inspection ]에서 [Method may static]를 선택 해제할 수 있습니다.

은 사용하지 ).self 될 것 요.@staticmethod를 참조해 주세요.

클래스 내에서 정적 메서드가 아닌 최상위 함수로 메서드를 이동해야 할 수도 있습니다.자세한 내용은 이 질문과 승인된 답변을 참조하십시오. python - 정적 메서드 또는 최상위 함수를 사용해야 합니까?

메서드를 최상위 기능으로 이동하면 PyCharm 경고도 수정됩니다.

클래스 메서드를 정적 메서드로 정의하면 다음과 같은 이점이 있을 수 있습니다.

  • 클래스 이름만 사용하여 메서드를 호출할 수 있으므로 인스턴스화할 필요가 없습니다.

남아 있는 이점은 존재하더라도 미미할 수 있습니다.

  • 조금 더 빨리 달릴 수 있다
  • 기억을 조금 아끼다

수도 .self단, 메서드는 클래스에서 유지하며 스태틱하게 하지 않는 것이 좋습니다.아니면 그냥 보기 흉한 장식가들을 추가하는 걸 피하고 싶을 수도 있어요.다음은 이 상황에 대한 몇 가지 잠재적인 해결 방법입니다.

만약 당신의 방법이 부작용만 가지고 있고 그것이 무엇을 반환하는지에 관심이 없다면:

def bar(self):
    doing_something_without_self()
    return self

반환값이 필요한 경우:

def bar(self):
    result = doing_something_without_self()
    if self:
        return result

에서는 ""를 사용하고 .self러면경!!!!!!!!!!!

to to to to to to to to to to to to to to to toself bar메서드 본문, PyCharm이 질문하고 있습니다.bar정적인Java와 같은 다른 프로그래밍 언어에서는 정적 메서드를 선언하는 명백한 이유가 있습니다.Python에서 정적 메서드(AFIK)의 유일한 이점은 클래스의 인스턴스 없이 호출할 수 있다는 것입니다.단, 이것이 유일한 이유라면, 여기서 수 있듯이, 최고 수준의 기능을 사용하는 것이 좋습니다.

요컨대, 나는 왜 그것이 거기에 있는지 100% 확신할 수 없다.아마 곧 출시될 때 제거될 것 같아요.

이 에러 메세지는, 테스트용 샘플 플레이어를 사용해 실수로 기능을 써 버린 것을 깨닫지 못했습니다.

my_player.attributes[item] 

올바른 방법 대신

self.attributes[item]

Python이 non static 메서드(@static method 추가 안 함)를 호출할 때 첫 번째 인수로 self를 전달하기 때문에 Pycharm이 이를 경고로 만드는 이유는 다음과 같습니다.파이컴은 알고 있어

예:

class T:
    def test():
        print "i am a normal method!"

t = T()
t.test()
output:
Traceback (most recent call last):
  File "F:/Workspace/test_script/test.py", line 28, in <module>
    T().test()
TypeError: test() takes no arguments (1 given)

자바에서 왔습니다.자바에서는 "self"를 "this"라고 부릅니다.클래스 메서드에서는 self(또는 this)를 인수는 필요 없습니다.메서드 안에서 필요에 따라 셀프라고 부르면 됩니다.그러나 Python은 메서드 인수로 self를 전달해야 합니다.

이 점을 이해하면 @BobStein의 답변과 같이 회피책이 필요하지 않습니다.

특정 IDE에서 이 오류를 회피하기 위해 다른 방법을 구현하는 것이 아니라 다음 사항이 의미가 있습니까?PyCharm은 이 구현에 대해 아무것도 제안하지 않습니다.

class Animal:
    def __init__(self):
        print("Animal created")

    def eat(self):
        not self # <-- This line here
        print("I am eating")


my_animal = Animal()

언급URL : https://stackoverflow.com/questions/23554872/why-does-pycharm-propose-to-change-method-to-static

반응형