我正在用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__
有关。
如何抑制这种烦人的警告?
答案 0 :(得分:1)
使用它的类扩展您的mixin,并使用inspect模块。
通过以下设置,我们:
__init__
中所有arg名称的列表我们通过不创建警告来消除警告。
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})