抑制混合中的意外参数警告

问题描述 投票:0回答:1

我正在用Python3.8编写mixin:

class Cloneable:
    def change_field(self, **kwargs):
        """ Create a new object with only the specified properties changed."""
        argdict = {**kwargs, **{key: self.__getattribute__(key) for key in self.__slots__ if
                                key not in kwargs and key[:2] != '__'}}
        return self.__class__(**argdict) 

在PyCharm上,我在最后一行收到警告“意外参数”。据推测这是由于关键字参数解包。如果这是一个函数,则可以在函数签名中包含**kwargs,但这是一个混合,并且我不知道它事先与哪个__init__有关。

如何抑制这种烦人的警告?

python suppress-warnings keyword-argument
1个回答
0
投票

我能为您提供的最佳解决方案是使用mixin扩展您的类并使用检查模块,如下例所示。通过此设置,您可以从超级服务器的init中获取所有的args,进行存储,然后将change_field中的密钥与所存储的arg名称进行比较。我知道这将事情变成了不再是混入的地方。保持混入有多重要?我认为mixin是错误的解决方案,因此这就是您遇到问题的原因。

它具有您无需压制任何警告的额外好处。您将改为修复它们。

import inspect

class Mixin:
    @property
    def names(self):
        return self.__names

    def __init__(self):
        sig = inspect.signature(self.__init__)
        self.__names = list()
        for param in sig.parameters.values():
            self.__names.append(str(param).split('=')[0])
        print(self.names)    # [a, b]

    def change_field(self, **kwargs):
        """ Create a new object with only the specified properties changed."""
        argdict = {**kwargs, **{key: self.__getattribute__(key) for key in self.__slots__ if
                                key not in kwargs and key[:2] != '__'}}

        return self.__class__(**{k:v for k, v in argdict.items() if k in self.names}) 


class App(Mixin):
    def __init__(self, a=None, b=None):
        Mixin.__init__(self)

App()

更多

这部分怎么了?

if key not in kwargs

您正在倒退。您应该让kwargs覆盖第二部分。像这样:

{**{key: self.__getattribute__(key) for key in self.__slots__ if key[:2] != '__'}, **kwargs}
© www.soinside.com 2019 - 2024. All rights reserved.