最小限の例では、次のとおりです。これはので、私のコンテナが保持している私が使用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クラスで定義しないでください。ここで答えを見つけ
値を整数として直接設定するのではなく、「dval」を使用する理由はありますか? –
Yup - 私はこれらの項目への読書専用ポインタを持っています。私は完全なコードを投稿しませんでしたが、それは関連していませんが、dviewと呼ばれる別の内部クラスがあります。これは、pointy整数を返すvalプロパティを持ち、セットを許可しません。 – kabanus