我正在尝试找到一种优雅的pythonic方法来解决以下问题。我有一个类,VideoAnalysisWidget
创建一大堆子小部件,例如VideoFileChoiceWidget
,RegionWidget
等。我想VideoAnalysisWidget.__init__
将任何适当的关键字参数传递给VideoFileChoiceWidget.__init__
,,RegionWidget.__init__
...为了实现这一点,我想使用如下代码:
import inspect
def filterArgs(func, **kwargs):
spec = inspect.getargspec(func)
ks = set(kwargs.keys())
ks.discard('self')
kinc = ks & set(spec.args)
kexc = ks - set(spec.args)
inc = {k: kwargs[k] for k in kinc}
exc = {k: kwargs[k] for k in kexc}
return(inc, exc)
然后,在其他地方:
def __init__(self, **kwargs):
(fcwArgs, otherArgs) = filterArgs(VideoFileChoiceWidget.__init__, **kwargs)
fcw = VideoFileChoiceWidget(**fcwArgs)
...
以这种方式做事,我的代码VideoAnalysisWidget
不必跟踪VideoFileChoiceWidget
. 如果我稍后修改VideoFileChoiceWidget
以采用新参数,则无需更改远程VideoAnalysisWidget
代码。
现在问题来了。VideoFileChoiceWidget
如果只有明确定义的关键字参数,这很好用。(顺便说一句,除了这些函数之外,我可以不使用任何位置参数self
。)但是如果VideoFileChoiceWidget
还有**kwargs
参数呢?事实上,它确实如此,因为它是 的子类ContainerWidget
,所以我想将任何额外的额外参数传递给它。(并且ContainerWidget
只需要**kwargs
。)从根本上说,问题是我的这个解决方案不能嵌套。
一个可能的解决方案是将附加参数列表附加到VideoFileChoiceWidget.__init__
,例如:
VideoFileChoiceWidget.__init__._args = ['description', 'visible', 'children']
...然后修改filterArgs
以使用它(如果可用)。但是有没有更好,更蟒蛇的方式来做到这一点?