2010-01-21 2 views
8

Eclipse에서 PyDev를 사용하여 Python으로 개발 중이며 일부 코드가 코드 분석 도구에서 오류를 생성합니다. 특히 :어떻게 PyDev를 수정합니까? "첫 번째 매개 변수로 메소드가 있어야합니다."오류

class Group(object): 
    def key(self, k): 
     class Subkey(object): 
      def __enter__(s): 
       self._settings.beginGroup(k) 
       return self 

      def __exit__(s, type, value, tb): 
       self._settings.endGroup() 

     return Subkey() 

나에게 "Method '__enter__- group' should have self as first parameter" 오류를 제공하고, __exit__에 대해 유사한 오류가 발생했습니다. 다른 변수에 self을 할당하지 않고이 문제를 해결하고 다른 메소드 서명에서 변수를 재사용하지 않고 해결할 수 있습니까?

+0

을 대신 self''의 s', 당신은 어디에서나 s''사용해야합니다. 일관성있게하십시오! – jathanism

+3

외부 클래스 self 변수에 대한 참조가 필요합니다. 일관성이 있다면 내부 클래스의 외부 클래스 참조를 음영 처리합니다. –

답변

18

당신은 환경 설정에서 해당 오류를 비활성화 할 수있는 일이 필요합니다

Window > Preferences > Pydev > Editor > Code Analysis > Others 

또는 리팩토링 코드 ...

class Group(object): 
    def key(self, k): 
     outer_self = self 
     class Subkey(object): 
      def __enter__(self): 
       outer_self._settings.beginGroup(k) 
       return outer_self 

      def __exit__(self, type, value, tb): 
       outer_self._settings.endGroup() 

     return Subkey() 

그 밖의 무엇을 기대합니까? 오류 검사가 도움이됩니다. 합법적 인 오류라고 생각하지 않는다면 오류를 비활성화하거나 코드를 리팩터링하십시오.

이 경우 리팩토링 코드를 말하고 싶습니다. King Radical의 대답에 의해 입증 된 것처럼 더 읽기 쉽습니다. 그는 s이 또 다른 self이라는 것을 이해하지 못했습니다.

+0

동의 함, FogleBird. –

0
def __enter__(self): 

def __exit__(self, type, value, tb): 

클래스 멤버 방법은 항상 ... 자신의 첫 번째 매개 변수는 self

+0

그리고 PyDev 코드 분석 오류를 수정하는 것 이외에 코드를 깨뜨리는 것 이외에는 성취 할 것이라고기도 해주면 어떨까요? –

+0

self를받는 매개 변수의 이름을 self로 지정할 필요는 없습니다. 그것은 s로 명명 될 수 있으며 객체에 대한 참조를 포함합니다. –

+0

@Chris B : 코드를 깨뜨리지 않고 수정했습니다. 내 대답을 보라. – GreenMatt

2

PyDev는 Python 클래스 메소드가 클래스 멤버 변수에 액세스하려는 경우 수신하는 첫 번째 변수로 self을 가져야 함을 알려줍니다. 참조 : http://www.python.org/doc/faq/general/#why-must-self-be-used-explicitly-in-method-definitions-and-calls

편집 : 처음에는 self 대신 s을 사용했을 수도 있지만 그 밖의 다른 대답은 볼 수 있습니다. 그러나이를 수행하려는 경우 self 대신이 메소드에서 변수로 s을 사용해야합니다.

+0

일관성이 중요하기 때문에 +1. – jathanism

+0

코드가하는 일을 오해하고 있습니다. 이것은 다른 클래스 메소드 내에서 정의 된 컨텍스트 관리자입니다. 따라서 내부 클래스 Subkey는 실제로 외부 클래스 Group의 자체 변수에 대한 메서드를 호출합니다. 자체 인스턴스 변수에 대한 참조가 필요 없습니다. –

+0

@Chris B .: 원래의 질문에 대해서는 (적어도 저에게는) 명확하지 않았습니다. – GreenMatt

2

"self"를 사용하는 것이 널리 받아 들여지는 규칙이므로 처음에는 오류가 있어서는 안됩니다. 그것은 "클래스 인스턴스를 첫 번째 인수로 사용하고 있습니까?"라는 의미에서 대부분 경고 여야합니다.

15

을 PyDev의 오류와 함께 사용하면 언제나 PyDev 오류를 무시할 수있는 수정 사항이 표시됩니다. 이 특정 경우에는 라인 끝에 #@NoSelf을 추가하여 오류를 무시할 수 있습니다. Ctrl+1은 사용하지 않은 가져 오기가 필요할 때나 다른 상황에서도 유용합니다.

+0

이것은 정답이며 받아 들여야합니다. – tsbertalan

2

IMO 이것은 바보 같은 경고입니다. 이름은입니다. "자체"는 규칙입니다. 나는 멤버 이름이 더 분명 할 수 있도록 "_"이름을 사용하는 습관,

class myClass(object): 
    def __init__(_, color, shape, weight): 
     _.color=color 
     _.shape=shape 
     _.weight=weight 
... 

있고 난 모든 코드 라인의 수천의 내 라이브러리에 이상이 경고를 얻을. 그래서 나는이 경고를 해제 할 것이다. 관례에 따라 '_'을 (를) 사용하는이 프로젝트에 대해 지정할 수있는 것이 좋을 것입니다 ...

+6

대회 만이 아닙니다. 협약은 매우 중요합니다. 시간을 절약하고 의사 소통을 더 쉽게 이해할 수 있습니다. 기본적으로, 당신은 무의미하게 contrarian 스타일을 포기하기 전까지는 당신이 사용하는 모든 도구에 의해 무자비하게 괴롭힘을 당할 자격이 있습니다 :-). – Glyph

+0

중요하다면 언어 경고 또는 오류 여야합니다. pydev 나 python은 여기에 책임이있다. 나 ... 절대로 나 :-) –

0

당신은 장식 사용할 수 있습니다 : 당신이 거 사용하는 경우`

class aClass: 
     def __init__(self):  # instance-dependent method 
     self.atribite1 = [] 
     self.atribute2 = 0 

     @staticmethod 
     def static():    # static method 
     pass 

The Built-in function used for this

관련 문제