Как исправить ошибки PyDev "метод должен иметь self в качестве первого параметра"

Я разрабатываю Python, используя PyDev в Eclipse, и некоторые из моих кодов генерируют ошибки в инструменте анализа кода. В частности:

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 к другой переменной и повторное использование переменной в сигнатурах другого метода?

7 ответов


вы можете отключить эту ошибку в настройках...

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()

чего еще вы ожидаете? Проверки ошибок помогут вам. Если вы не думаю, что они законные ошибок, отключить их или рефакторинг кода.

в этом случае я бы сказал, что рефакторинг кода. Это более читабельно, о чем свидетельствует ответ Короля радикала. Он этого не понимал!--2--> другой self.


используя Ctrl+1 в строке с ошибкой от PyDev всегда будет приносить вам исправление, которое позволит вам игнорировать ошибку PyDev в строке. В этом конкретном случае это позволит вам игнорировать ошибку, добавив #@NoSelf до конца строки. Ctrl+1 также полезно, когда требуется какой-то неиспользуемый импорт и в других ситуациях.


IMO это глупое предупреждение. the имя "Я" - это только условность. У меня появилась привычка использовать имя"_", чтобы имена членов были более очевидными,

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

и я получаю это предупреждение по всей моей библиотеке тысяч строк кода. Так что я отключу это предупреждение. Было бы неплохо иметь возможность указать "для этого проекта я использую '_' по соглашению"...


Это не должно быть ошибкой в первую очередь, так как использование "себя" является только широко принятым соглашением. Это должно быть предупреждение в лучшем случае, в смысле "вы уверены, что используете экземпляр класса в качестве первого аргумента?"


PyDev говорит вам, что методы класса Python должны иметь self в качестве первой переменной, которую они получают, если они собираются получить доступ к переменным-членам класса. Смотрите: http://www.python.org/doc/faq/general/#why-must-self-be-used-explicitly-in-method-definitions-and-calls

Edit: мне изначально не приходило в голову, что вы можете использовать s вместо self, но с учетом других ответов, это может быть. Однако, если вы собираетесь сделать это, вы также нужно использовать s как ваша переменная в методе, а не self.


вы можете использовать декоратор:

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

        @staticmethod   
        def static():             # static method
        pass

встроенная функция, используемая для этого


def __enter__(self):

и

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

методы-члены класса всегда должны иметь свой первый параметр self