1

これは私が持っているクラスです:

class metadict(dict):
    def __init__(self, do_something=False, *args, **kwargs)
        if do_something:
            pass
        super(metadict,self).__init__(*args,**kwargs)

アイデアは、辞書をカプセル化し、特別なキーワードでいくつかの機能を追加することです。do_something作成時に追加することはできませんが、辞書は保持できます。他のすべての側面については、通常の辞書と同じように動作します。

とにかく、問題は、私が与えるものは何でも、私が望むものではないargs最初の値を割り当てることから始まるdo_somethingということです.

私が今していることはこれです:

class metadict(dict):
    def __init__(self, do_something=False, *args, **kwargs)
        if not isinstance(do_something, bool):
            args = list(args)
            args.append(do_something)
        elif do_something:
            pass
        super(metadict,self).__init__(*args,**kwargs)

しかし、それは私には正しく見えません。do_somethingkwargsの値を確認することもできますが、署名をいじって有用な情報を削除するため、さらに悪化します...

Python でオプション、位置、およびキーワード引数を安全に使用する方法はありますか? そうでない場合、他の簡単な回避策はありますか?

私はpython 2.6を使用しています

4

1 に答える 1

3

これは Python 3 の新機能です。Python 2 での最善の回避策は次のとおりです。

def foo(*args, **kwargs):
    do_something = kwargs.pop("do_something", False)

Python は引数のマッチングを巧妙にしようとするため、このような動作が発生します。たとえば、位置引数を渡しすぎると、キーワード引数が位置指定になります。

PSなぜmetadict辞書のエントリとしてではなく、属性として保存しないのですか?

于 2012-12-03T16:06:09.380 に答える