对于特定用例,我想定义一个列表类,如果索引为负数或超出范围,则返回 0。
我目前的方法已经服务于特定目的:
class mlist(list):
def __getitem__(self, n):
if (len(self)<=n) or (n<0):
return 0
return super(mlist, self).__getitem__(n)
l = mlist([1,2,3,4])
l[-2]
>>> 0
l[10]
>>> 0
Run Code Online (Sandbox Code Playgroud)
但不幸的是,它在切片列表时会导致一些不良行为:
l[0:2]
>>> TypeError: '<=' not supported between instances of 'int' and 'slice'
Run Code Online (Sandbox Code Playgroud)
有没有办法解决这个问题?
你想压制IndexError并返回0。所以,你也可以这样做:
class mlist(list):
def __getitem__(self, n):
try:
return super().__getitem__(n)
except IndexError:
return 0
Run Code Online (Sandbox Code Playgroud)
但是,这允许像通常列表一样进行负索引(从末尾访问)(因为这不会引发IndexError)。如果你也想抑制它,你可以尝试:
class mlist(list):
def __getitem__(self, n):
try:
if n < 0 or n >= len(self):
return 0
return super().__getitem__(n)
except TypeError:
return super().__getitem__(n)
Run Code Online (Sandbox Code Playgroud)
这假定 n是一个 int 并相应地工作,如果不是,TypeError则将在比较时引发a并super调用该方法。然后,当传递无效类型(例如字符串)时,这会处理切片并抛出适当的错误。
| 归档时间: |
|
| 查看次数: |
62 次 |
| 最近记录: |