13

我正在使用 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给另一个变量并在其他方法签名中重用该变量?

4

6 回答 6

20

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

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

于 2010-01-21T20:53:15.887 回答
18

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

于 2010-02-12T01:00:57.823 回答
5

您可以使用装饰器:

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

        @staticmethod   
        def static():             # static method
        pass

用于此的内置函数

于 2017-07-25T07:18:51.317 回答
3

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

于 2010-01-21T23:35:47.683 回答
3

IMO 这是一个愚蠢的警告。“self”这个名字只是约定俗成的。我养成了使用名字“_”的习惯,让成员名更明显,

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

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

于 2011-10-28T09:52:44.217 回答
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在方法中使用 as 您的变量,而不是self.

于 2010-01-21T20:54:34.687 回答