我的猜测是你必须围绕所需的对象创建自己的子类包装器并重新实现 __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