【问题标题】:Python 2.7 warning: __init__ not compatible to __new__Python 2.7 警告:__init__ 与 __new__ 不兼容
【发布时间】:2019-02-06 05:50:37
【问题描述】:

我在 Python 2.7 中定义了一个类,如下所示:

from future.builtins import object


class Point(object):

    def __init__(self, x, y):
        self.x = x
        self.y = y

在 PyCharm 中,这会在 __init__ 行中给出警告:

Signature is not compatible to __new__.

我不明白这个警告告诉我什么。有人可以举一个例子,这个警告会正确地捕获错误,或者可以关闭这个警告吗?

有一个 PyCharm 线程,但它对我没有帮助:https://intellij-support.jetbrains.com/hc/en-us/community/posts/115000254530-PyCharm-init-Signature-is-not-compatible-to-new-

【问题讨论】:

  • 我能找到的唯一future.builtins 模块在其API 中没有列出object,那么您究竟在那里导入什么?如果您使用标准 object,您会收到相同的警告吗?无论如何,这个警告背后的原因是,如果一个类同时定义了__new__ 和__init__,它们必须具有兼容的参数,因为通常会将相同的参数传递给两者(一个例外是@987654331 的模糊可能性@ 返回一个不相关类的实例)。
  • “我能找到的唯一 future.builtins 模块没有在其 API 中列出对象”:这个github.com/PythonCharmers/python-future/blob/…“无论如何,这个警告背后的原因是,如果一个类同时定义了 new 和 init" 从理论上讲是有道理的,但据我所知,没有人会覆盖 __new__。
  • 我猜你只是想创建一个 new style 类,它在 Python 3 中成为标准。为此你可以简单地使用 object 而无需导入任何东西
  • @knub 如果没有人覆盖__new__,它怎么知道它应该接受参数x 和y 以与您的__init__ 兼容?就像 guidot 写的那样,您可以使用 object 来定义新样式的类,而无需导入任何东西。我怀疑您未来的导入会导致这些问题。

标签: python python-2.7 pycharm python-2to3


【解决方案1】:

我遇到了同样的问题,并在here找到了解决方案。

正如上面链接中所讨论的,直接的解决方案是删除您的 Pycharm 配置目录(对我来说是“/home/username/.PyCharm2018.3”)。但是,它也会删除所有其他配置。最后,我只是通过从检查中删除规则来解决问题。您可以在 Pycharm 设置窗口中找到该规则(见下图)。

【讨论】:

    【解决方案2】:

    这是一个 PyCharm 错误;您可以通过熊辉的帖子禁用警告。基本上__new__ 是一个在构造类时使用相同参数调用before __init__ 的方法,因此它们的签名必须兼容(两个函数必须能够使用相同的参数调用) 或无法实例化该类。例如,这里有一个代码 sn-p,PyCharm 正确地应用了警告:

    class Test(object):
        def __new__(cls, arg1):
            return super().__new__(cls)
    
        def __init__(self):
            pass
    

    尝试使用Test() 创建类会抛出一个TypeError,因为__new__ 需要一个参数,但是使用Test('something') 创建类也会抛出一个TypeError,因为__init__ 不需要任何参数参数,使得无法构造类。通常这不是问题,因为object 中__new__ 的默认实现接受任意数量的参数,但是如果您自己定义__new__,则需要注意签名保持兼容,以便该类实际上可以构造,这是警告的目的。

    【讨论】:

      猜你喜欢
      • 2011-06-19
      • 2012-02-11
      • 2017-03-25
      • 2018-09-16
      • 2014-03-01
      • 2011-03-09
      • 2015-12-23
      • 1970-01-01
      • 2018-02-08
      相关资源
      最近更新 更多