2016-10-25 6 views
0

私はdata = [[t1, t2, ...], [v1, v2, ...]]のようなデータを持っています。私はdata[0]の代わりにdata.tと呼ぶことができるので、これをクラスにまとめたいと思います。*引数アンパック演算子をオーバーロードする方法は?

私は次のようにこれを実行しようとしました:

class Variable: 
    def __init__(self, data): 
     self.t = data[0] 
     self.v = data[1] 

    def __getitem__(self, key): 
     if key == 0: 
      return self.t 
     elif key == 1: 
      return self.v 
     else: 
      raise ValueError("not valid key '{}'".format(key)) 

    def __setitem__(self, key, value): 
     if key == 0: 
      self.t = value 
     elif key == 1: 
      self.v = value 
     else: 
      raise ValueError("not valid key '{}'".format(key)) 

data[0]はまだ動作するよう__getitem____setitem__オーバーロード理由は後方compabilityのためです。これは、ほとんどのもののために働く、しかし私は、次の呼び出しの問題に実行する:

func_that_takes_two_arguments(*data) # unpacking data 

私が手にエラーが

私は引数を開梱作業を適切に私のクラスの仕事をすることができますどのように
/Users/pingul/Workspace/lhcfill/oml.py in __getitem__(self, key) 
    52         return self.val 
    53       else: 
---> 54         raise ValueError("not valid key  '{}'".format(key)) 
    55 
    56     def __setitem__(self, key, value): 
ValueError: not valid key '2' 

のですか?

+0

あなたは '*'をオーバーロードしていないので、オブジェクトを反復するだけです。 'ValueError'ではなく、IndexErrorを呼び出す必要があります。 – jonrsharpe

答えて

1

*演算子は、オブジェクトを反復処理することによって動作します。この繰り返しは、__getitem__()を実装するだけで実行できますが、実装に問題があります。代わりにValueErrorを上げる場合は、反復の終了を示すIndexErrorをスローする必要があります。

https://docs.python.org/3/reference/datamodel.html#object.getitem明示的に述べている参照してください

注:forループが違法なインデックスがシーケンスの最後の適切な検出を可能にするためIndexErrorが提起されることを期待しています。

https://docs.python.org/2/library/functions.html#iterは、これを「シーケンスプロトコル」と呼んでいる。

関連する問題