次の問題を解決するためのエレガントな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
、可能であればこれを使用するように変更します。しかし、それを行うためのより良い、よりpythonicな方法はありますか?