1

次の問題を解決するためのエレガントなpythonicの方法を見つけようとしています。、、VideoAnalysisWidgetなどの子ウィジェット全体を作成するクラス、、があります。適切なキーワード引数を、、、に渡したい...これを達成するには、次のようなコードを使用したいと思います。VideoFileChoiceWidgetRegionWidgetVideoAnalysisWidget.__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な方法はありますか?

4

1 に答える 1