我正在用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__
有关。
如何抑制这种烦人的警告?
我能为您提供的最佳解决方案是使用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}