pin*_*gul 8 python arguments argument-unpacking
我有类似的数据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))
Run Code Online (Sandbox Code Playgroud)
__getitem__
和重载的原因__setitem__
是为了向后兼容,以便data[0]
仍然有效。这适用于大多数情况,但是我在以下调用中遇到了问题:
func_that_takes_two_arguments(*data) # unpacking data
Run Code Online (Sandbox Code Playgroud)
我得到的错误是
/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'
Run Code Online (Sandbox Code Playgroud)
如何使用参数解包运算符使我的类正常工作?
该*
运算符通过迭代对象来工作。仅通过实现就可以很好地执行此迭代__getitem__()
,但您的实现是错误的。相反,如果 raise ValueError
,您应该抛出IndexError
表示迭代结束的信号。
另请参阅https://docs.python.org/3/reference/datamodel.html#object。getitem明确指出
注意:
for
循环期望IndexError
非法索引会引发 an 错误,以允许正确检测序列的末尾。
https://docs.python.org/2/library/functions.html#iter指出这称为“序列协议”。
归档时间: |
|
查看次数: |
3952 次 |
最近记录: |