我如何修复PyDev“方法应该有自己作为第一个参数”错误

时间:2010-01-21 20:47:43

标签: python code-analysis pydev

我在Eclipse中使用PyDev开发Python,我的一些代码在代码分析工具中生成错误。具体做法是:

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 个答案:

答案 0 :(得分:19)

您可以在首选项中禁用该错误...

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

答案 1 :(得分:18)

在带有PyDev错误的行中使用Ctrl+1将始终为您提供一个修复程序,允许您忽略该行中的PyDev错误。在这种特定情况下,它允许您通过将#@NoSelf添加到行尾来忽略错误。当需要一些未使用的导入时以及在其他情况下,Ctrl+1也很有用。

答案 2 :(得分:3)

IMO这是一个愚蠢的警告。 名称“自我”只是惯例。我习惯使用名称“_”来允许成员名称更明显,

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

我在我的数千行代码库中得到了这个警告。所以我将关闭此警告。很高兴能够指定“对于这个项目,我按惯例使用'_'”......

答案 3 :(得分:2)

PyDev告诉你Python类方法必须有self作为他们收到的第一个变量,如果他们要访问类成员变量的话。请参阅:http://www.python.org/doc/faq/general/#why-must-self-be-used-explicitly-in-method-definitions-and-calls

编辑:我最初没有想到你可能正在使用s而不是self,但鉴于其他答案,可能会这样。但是,如果您要这样做,则还需要在方法中使用s作为变量,而不是self

答案 4 :(得分:2)

首先它不应该是错误,因为使用“self”只是一个被广泛接受的约定。它应该是一个警告,意思是“你确定你使用类实例作为第一个参数吗?”

答案 5 :(得分:2)

你可以使用装饰者:

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

答案 6 :(得分:0)

def __enter__(self):

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

类成员方法总是需要让它们的第一个参数为self