【问题标题】:How do I fix PyDev "Method should have self as first parameter" errors如何修复 PyDev“方法应该将 self 作为第一个参数”错误
【发布时间】:2010-01-21 20:47:43
【问题描述】:

我在 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 分配给另一个变量并在其他方法签名中重用该变量的情况下解决这个问题?

【问题讨论】:

  • 如果你要使用s 而不是self,你必须在任何地方使用s。保持一致!
  • 我需要一个外部类 self 变量的引用。如果我是一致的,我会在内部类中隐藏外部类引用。

标签: python code-analysis pydev


【解决方案1】:

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

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

【讨论】:

  • 在我的情况下,我不能将 self 添加为第一个参数,因为烧瓶会抱怨。我有这一行 def validate_phone_number(form, field): 并且一旦我将其更改为 def validate_phone_number(self, form, field): 我收到以下错误“TypeError: validate_phone_number() missing 1 required positional argument: 'field'”
【解决方案2】:

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

【讨论】:

  • 这是正确答案,应该被接受。
【解决方案3】:

你可以使用装饰器:

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

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

      【讨论】:

      • 这不是只是一个约定。约定非常重要。它们可以节省时间并使沟通更容易理解。基本上,你应该被你使用的每一种工具无情地骚扰,直到你放弃这种毫无意义的逆向风格:-)。
      • 如果它那么重要,它应该是一个语言警告或错误。 pydev 或 python 都应该归咎于此,而不是我......永远不是我 :-)
      【解决方案6】:

      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

      【讨论】:

      • 您误解了代码的作用。这是在另一个类方法中定义的上下文管理器。因此,内部类 Subkey 确实打算调用外部类 Group 的 self 变量上的方法。并且不需要引用它自己的实例变量。
      • @Chris B.:最初的问题并不清楚(至少对我而言)。
      • 您似乎没有理解问题中的代码。好的起点是学习嵌套类和词法范围。在回复之前尝试一下代码示例并弄清楚它的作用也是一个好主意。
      猜你喜欢
      • 2011-10-02
      • 1970-01-01
      • 2012-10-04
      • 2020-09-20
      • 1970-01-01
      • 2017-06-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多