2016-10-15 7 views
2

最小限の例では、次のとおりです。これはので、私のコンテナが保持している私が使用kwargsから

class cont(object): 
    def __init___(self): 
     self._mydict = sdict(()) 
    @property 
    def mydict(self): 
     return self._mydict 
    @mydict.setter 
    def mydict(self,dict_initializor): 
     self._mydict = sdict(dict_initializor) 
     return self.mydict 

class sdict(dict): 
    class dval: 
     def __init__(self, val): 
      self.val = val 

    def __init__(self, args): 
     dictionary = dict(args) 
     for k,v in dictionary.items(): 
      self[k] = v 

    def __setitem__(self,key,value): 
     try:     self[key].val = value 
     except KeyError:  dict.__setitem__(self,key,self.dval(value)) 
    def __getitem__(self,key): 
     return dict.__getitem__(self,key).val 

は、今私は割り当てのものを上書きするために、コンテナ内のこのクラスを使用することができます(つまりPython言語では変更可能ですが)アイテムを取得するたびに、プリミティブ自体を取得します。 __str __/__ repr__関数を追加すると、これらを印刷するときにこの機能が働きますが、デバッグ目的では省略されています。

これはkwargsからを使用して一緒にこれを渡すときを除いて、ほとんどどこでもうまく動作:

def test(a,b): return a*b 
c = cont() 
c.mydict = {'a':1,'b':2} 
print c.mydict['a']+c.mydict['b'],type(c.mydict['a']+c.mydict['b']) 
print test(**c.mydict) 

出力:

3 <type 'int'> 
Traceback (most recent call last): 
    File "D:\kabanus\workspace\py-modules\test.py", line 32, in <module> 
    print test(**c.mydict) 
    File "D:\kabanus\workspace\py-modules\test.py", line 28, in test 
    def test(a,b): return a*b 
TypeError: unsupported operand type(s) for *: 'instance' and 'instance' 

を明らかに開梱手順は、キーワードの値を作成するために__getitem__使用していません。また、値()とitems()をオーバーライドしようとしましたが、成功しませんでした。次に、私が定義していないすべてのdictメソッドをNoneに設定し、呼び出されているかどうかを確認します。

ボトムライン - __getitem__または他の方法を使用するために、** kwargsをアンパックするにはどうすればよいですか?
これも可能ですか?

可能な場合は、mul、add、divなどをdvalクラスで定義しないでください。ここで答えを見つけ

+0

値を整数として直接設定するのではなく、「dval」を使用する理由はありますか? –

+0

Yup - 私はこれらの項目への読書専用ポインタを持っています。私は完全なコードを投稿しませんでしたが、それは関連していませんが、dviewと呼ばれる別の内部クラスがあります。これは、pointy整数を返すvalプロパティを持ち、セットを許可しません。 – kabanus

答えて

1

、および見つけることが、これは容易にする方法があるはず: Does argument unpacking use iteration or item-getting?

概要:Pythonはあなたのpythonを無視するかもしれないので、組み込み関数からの継承 (dictの、リストが...)問題がありますAPIは完全に(私にとってはそうだったように)、基礎となるC言語を使用します。これは引数の展開で起こります。

解決策:使用可能な抽象を使用してください。私の例では:

from UserDict import UserDict 

を追加し、コード内のすべての "dict"オカレンスをUserDictに置き換えてください。この解決策は、リストとタプルに当てはまるはずです。

関連する問題