簡體   English   中英

如何重載*參數解包運算符?

[英]How to overload * argument unpacking operator?

我有data data = [[t1, t2, ...], [v1, v2, ...]] 我想將它包裝在一個類中,這樣我就可以調用data.t而不必使用data[0]

我試着用以下方法做到這一點:

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))

__getitem____setitem__重載的原因是為了向后兼容,因此data[0]仍然有效。 這適用於大多數事情,但是我遇到以下調用時出現問題:

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'

如何使用參數解包操作符使我的類正常工作?

*運算符通過迭代對象來工作。 只需實現__getitem__()就可以執行此迭代,但您的實現有問題。 相反,如果提出ValueError ,則應拋出IndexError ,它表示迭代結束。

另請參見https://docs.python.org/3/reference/datamodel.html#object。 明確說明的getitem

注意: for循環期望為非法索引引發IndexError ,以允許正確檢測序列的結尾。

https://docs.python.org/2/library/functions.html#iter聲明這稱為“序列協議”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM