抑制Mixin中的意外参数警告

时间:2020-05-25 11:51:56

标签: python suppress-warnings keyword-argument

我正在用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__有关。

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

2 个答案:

答案 0 :(得分:1)

检查模块

使用它的类扩展您的mixin,并使用inspect模块。

通过以下设置,我们:

  1. 存储子类的__init__中所有arg名称的列表
  2. 针对我们的列表过滤参数

我们通过不创建警告来消除警告。

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():             # Signature(a=None, b=None).values()
            self.__names.append(str(param).split('=')[0]) # str(Parameter(a=None)).split('=')[0]
        print(self.names)    # [a, b]

    def change_field(self, **kwargs):
        """ Create a new object with only the specified properties changed."""
        argdict = {**{key: self.__getattribute__(key) for key in self.__slots__}, **kwargs}
        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()

更多

您正在倒退。您应该让kwargs覆盖__slots__键。您还试图抑制以双下划线结尾的键。一切不包括在内的东西(包括邓德尔)都将在该最终过滤器中删除。

答案 1 :(得分:0)

我已经成功解决了这个问题。感谢迈克尔·吉德里(Michael Guidry)的意见,应该颠倒词典的顺序!

解决方案是在将__init__作为参数的mixin中包括伪**kwargs方法:

class Cloneable:
    def __init__(self, **kwargs):
        ...

    def change_field(self, **kwargs):
        argdict = {key: self.__getattribute__(key) for key in self.__slots__}
        return self.__class__(**{**argdict, **kwargs})
相关问题