python列表负索引_Python列表/数组:禁用切片中的负索引环绕

我的猜测是你必须围绕所需的对象创建自己的子类包装器并重新实现 __getitem__() 将负键转换为 None ,然后调用超类 __getitem__

注意,我建议的是继承现有的自定义类,但不是像 list 或 dict 这样的内置类 . 这只是围绕另一个类创建一个实用程序,而不是混淆 list 类型的正常预期操作 . 在您的操作完成之前,您可能希望在特定环境中使用一段时间 . 最好避免进行全局不同的更改,这会使代码的用户感到困惑 .

object.getitem(self,key)调用以实现self [key]的评估 . 对于序列类型,接受的键应该是整数和切片对象 . 请注意,负索引的特殊解释(如果类希望模拟序列类型)取决于getitem()方法 . 如果key是不合适的类型,则可能引发TypeError;如果序列的索引集之外的值(在对负值进行任何特殊解释之后),则应引发IndexError . 对于映射类型,如果缺少键(不在容器中),则应引发KeyError .

您甚至可以创建一个简单地将实例作为arg的包装器,并且在转换密钥时将所有 __getitem__() 调用推迟到该私有成员,以便您可以想要子类化类型,而只需要一个实用程序任何序列对象的包装器 .

后一个建议的简单例子:

class NoWrap(object):

def __init__(self, obj, default=None):

self._obj = obj

self._default = default

def __getitem__(self, key):

if isinstance(key, int):

if key < 0:

return self._default

return self._obj.__getitem__(key)

In [12]: x = range(-10,10)

In [13]: x_wrapped = NoWrap(x)

In [14]: print x_wrapped[5]

-5

In [15]: print x_wrapped[-1]

None

In [16]: x_wrapped = NoWrap(x, 'FOO')

In [17]: print x_wrapped[-1]

FOO

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值