0

タイトルが間違っていたり誤解を招いたりしていないことを願っています。この種の名前が何であるかは完全にはわかりません。

基本的に、私は辞書(およびそのいくつかのサブクラス:defaultdictand OrderedDict、たとえば)で多くの作業を行ってきました.さまざまな種類の辞書。理想的には、これを迅速に (つまり、ある程度の最適化を行って)、もちろんエレガントに実行したいと考えています。これが私が今持っているものの例です:

def filter_dict(old_dict, keep_keys): 
    return {k:v for k,v in old_dict.items() if k in keep_keys}

これはうまく機能しますがold_dict、基本的な辞書以外の場合は、それを失います。

さて、新しく作成された辞書を old_dict のクラスのコンストラクターでラップするようなことはできますが、デフォルト値を返す関数を最初の引数としてtype(old_dict)({.....})取る defaultdicts ではまだ機能しません。それが 2 番目の引数である場合、コンストラクターに何らかのものを渡すことができますが、これは複雑になります。*args

私の質問は、コンストラクターへの部分的なアプリケーションを取得できますか? そのインスタンスの内臓を取得し、そのクラス コンストラクターを、items. Haskell では次reverse = lambda f, x, *args: f(*args, x)のようなことを行いますが、Python では許可されていません。

私は何が欠けていますか?クラスへの内省?いじくり回す__new__?工場...何か?ここでは、きれいだが機能的なものを手に入れようとしているのは本当にばかげているように感じます(har)。

洞察をお寄せいただきありがとうございます。

4

1 に答える 1

0

元のオブジェクトをコピーしてから、コピーを変更します。あなたの例では:

def filter_dict(old_dict, keep_keys): 
    res = old_dict.copy()
    for k in res.keys():
        if k not in keep_keys:
            res.pop(k)
    return res

あなたのヘルパー関数は、変更したいものだけを知っておりold_dict、同じに保ちたいものは知らないようです。copyしたがって、最も安全な方法は、メソッド (またはモジュール)に依存してから、不要なものをcopy削除または変更することです。それ以外の場合は、オブジェクトを作成するために使用された引数を正確に思い出す何らかの方法が必要ですが、これを行うための一般的な方法が存在するかどうかはわかりません。

于 2013-03-02T07:20:07.680 に答える