作为我的起点的课程如下:
class Test:
def __getitem__(self, key):
global frame
frame = inspect.currentframe()
if key > 9:
raise KeyError
return key
我的想法是用来frame.f_back
发现为实例自动创建了一个迭代器,如以下示例所示:
for x in Test():
x
在运行完这两个程序并查看之后frame.f_back
,不清楚是否__getitem__
可以获得足够的信息来检测是否从与其交互的任何“迭代器”中调用了该信息。最简单的解决方案是使容器从1开始而不是从0开始访问其内容,或者甚至在将密钥传递给函数之前强制将其包装在列表中,如下所示:
>>> class Test:
def __getitem__(self, key):
if not isinstance(key, list):
raise TypeError
if len(key) != 1:
raise ValueError
key = key.pop()
if not isinstance(key, int):
raise TypeError
if not 0 <= key < 10:
raise KeyError
return key
>>> for x in Test():
x
Traceback (most recent call last):
File "<pyshell#42>", line 1, in <module>
for x in Test():
File "<pyshell#39>", line 4, in __getitem__
raise TypeError
TypeError
>>> Test()[[5]]
5
>>>
有没有一种方法__getitem__
可以知道它被自动用作迭代器并引发异常以防止此类使用?
如果目标是阻止对象成为可迭代对象,则可以对__iter__
方法强制执行错误:
class Test:
def __getitem__(self, key):
if key > 9:
raise KeyError
return key
def __iter__(self):
raise TypeError('Object is not iterable')
测试运行:
>>> t = Test()
>>> for x in t:
print(x)
Traceback (most recent call last):
File "<pyshell#126>", line 1, in <module>
for x in t:
File "<pyshell#122>", line 7, in __iter__
raise TypeError('Object is not iterable')
TypeError: Object is not iterable
但__getitem__
仍然可以使用:
>>> t[0]
0
>>> t[1]
1
>>> t[10]
Traceback (most recent call last):
File "<pyshell#129>", line 1, in <module>
t[10]
File "<pyshell#122>", line 4, in __getitem__
raise KeyError
KeyError
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句