2017-06-30 24 views
0

私はいくつかの引数(オプション引数を含む)を期待する関数/メソッドA()を持っています。別の機能B()は、前記機能A()に渡されるデータに対する前処理を行う。私は機能のB()のいくつかの代替実装を持っている私は別の上の1つの利点について混乱を引き起こしている。 私はそれらの中のどれを(もしあれば)使うべきかを理解したいと思います。結局のところPython(dictと変数)で使用する関数に引数を渡す方法はありますか?

、ここThere should be one-- and preferably only one --obvious way to do it.

は、コードスニペットである:上記のコードで

class Foo(object): 

    def __init__(self, param1, param2, param3=None): 
     self.param1 = param1 
     self.param2 = param2 
     self.param3 = param3 

    @classmethod 
    def from_dump_v1(cls, dump): 
     param1, param2, param3 = dump.get('param_1'), dump.get('_param_2'), dump.get('paramThree') 
     return cls(param1, param2, param3) 

    @classmethod 
    def from_dump_v2(cls, dump): 
     dump['param1'] = dump.pop('param_1') 
     dump['param2'] = dump.pop('_param_2') 
     dump['param3'] = dump.pop('paramThree') 
     return cls(**dump) 

    @classmethod 
    def from_dump_v3(cls, dump): 
     result = dict() 
     result['param1'] = dump.get('param_1') 
     result['param2'] = dump.get('_param_2') 
     result['param3'] = dump.get('paramThree') 
     return cls(**result) 

__init__A()from_dump_v*指すIから選んだする必要が異なる実装を表します。
注:dumpはすべて3つのキーと値のペアを持つ辞書、つまりparam_1,_param_2およびparamThreeです。これを行うには

+0

申し訳ありません。 より現実的な要件で質問を更新しました。 –

答えて

7

一つ明白な方法は次のようになります。dump辞書は、任意のキーを保持している場合は

@classmethod 
def from_dump_v(cls, dump): 
    return cls(**{k.replace('_', ''): v for k, v in dump.items()}) 

、私はこれを行うには1明白な方法を見ることはできません。私はオランダ人ではない。 enumerateで何かを明らかに

しかし、ファクトリ関数の引数をある程度制御して、あなたの代わりに辞書の配列にデータ型を変更することができ、その後、実行します。

@classmethod 
def from_dump_v(cls, dump): 
    return cls(**{"param{}".format(i): x for i, x in enumerate(dump, 1)}) 
+0

しかし、私はいつも '_'を置き換えたくないかもしれません。 –

+0

@KshitijSaraogiそれでは、必要な方法でキーを変換し、それを辞書の理解に使用する関数を書くことができます。あるいは、他の可能性を調べて対処できるように、あなたの例を広げることができます。 –

0

それはあなたと思われますクラスの初期化を処理するファクトリ関数を作成しています。そのようにするには、*args**kwargsを使用して、任意の数の引数(パラメータとキーワード引数)をファクトリ関数に渡すことができます。しかし、それは冗長に見える。あなたがあなたの好みに*args**kwargsで値を処理して、あなたのクラスの__init__メソッドに渡すことができ、from_dump_vx

class Foo(object): 
    def __init__(self, param1, param2, param3=None): 
     self.param1 = param1 
     self.param2 = param2 
     self.param3 = param3 

    @classmethod 
    def from_dump_vx(cls, *args, **kwargs): 
     return cls(*args, **kwargs) 

したがって、あなたはこのような何かを持つことができます。

その後は、このようなあなたのクラスを初期化することができます:ここに私の質問を簡素化するためのオーバー

y = Foo.from_dump_vx(1, 2, param3=3) 
関連する問題