所以我正在写一个类,目的是对我正在测量的信号进行数据分析。有很多方法可以处理信号和其他可选的元数据,这些元数据可以与我测量信号的每次试验相关联。我想我的问题归结为我可以处理多个关键字参数的最佳方式,我的类可以自动检测相关参数,而不仅仅是一堆if-else语句,我想类似于如何添加许多可选关键字到matplotlib图?
例如,假设我有这样一个假想的类:
class Signal:
def __init__(self, filepath, **kwargs):
self.filepath = filepath
self.signal_df = pd.read_csv(self.filepath)
for k,v in kwargs.items():
setattr(self, key, value)
在对象的初始构造之后,根据传递的关键字参数,将会有相关的方法。因此,我可以轻松地创建以下两个对象:
signal_1 = Signal('filepath_0', **{'foo':1, 'bar':'9.2'})
signal_2 = Signal('filepath_1', **{'foo':12, 'baz':'red'})
为了解决这个问题,我几乎只是在init中实现了语句()方法,这样我就可以这样做:
class Signal:
def __init__(self, filepath, **kwargs):
self.filepath = filepath
self.signal_df = pd.read_csv(self.filepath)
for k,v in kwargs.items():
setattr(self, key, value)
if hasattr(self, 'foo'):
self.method_0(self.foo) # generic method that takes foo as argument
if hasattr(self, 'bar'):
self.method_1(self.bar) # generic method that takes bar as argument
else:
self.method_2(1.0) # alternate method if bar is not there
这似乎是一种非常笨拙的做事方式,我希望有更好的解决方案。我感谢任何和所有的帮助!
我不会在这里使用**kwargs
。只需使用与位置参数相同的哨兵默认值来定义仅关键字的参数。
class Signal:
def __init__(self, filepath, *, foo=None, bar=None)):
self.filepath = filepath
self.signal_df = pd.read_csv(self.filepath)
if self.foo is not None:
self.foo = foo
self.method_0(foo)
if self.bar is not None:
self.bar = bar
self.method_1(bar)
else:
self.method_2(1.0)
当您需要接受实际上一无所知的参数时,请使用**kwargs
,除非它们需要传递给其他方法。