有没有一种方法可以为定义__getitem__方法的类禁用迭代而无需在键上施加约束?

夜空中塔

作为我的起点的课程如下:

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__可以知道它被自动用作迭代器并引发异常以防止此类使用?

相关: 为什么在类上定义__getitem__使其在python中可迭代?

抽烟

如果目标是阻止对象成为可迭代对象,则可以对__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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

有没有一种方法可以在TinkerGraph上定义架构约束?

有没有一种方法可以为foreach的每次迭代设置状态

有没有一种方法可以存储此变量而无需重置

有没有一种方法可以为tmux复制模式重新定义导航键?

有没有一种方法可以为iPad上的表单启用视差?

有没有一种方法可以创建自定义用户和角色,而无需在IdenitityUser,IdentityRole和IdentityDbContext上指定TKey?

有没有一种方法可以为app.yaml中的所有静态文件设置默认的HTTP标头,而无需重复?

有没有一种方法可以为Azure网站指定机器密钥,而无需在web.config中指定机器密钥?

在Netbeans中,有没有一种方法可以显示类中的所有公共变量和方法,而无需实际生成接口文件?

有没有一种方法可以将决策树与分类变量一起使用而无需一键编码?

有没有一种方法可以为RichTextBox分组或暂时禁用撤消历史记录?

有没有一种方法可以动态导入组件的类,而无需在angular2的编译时知道它们的类名?

在VB中,有没有一种方法可以创建当前类型的实例而无需命名呢?

有没有一种方法可以提供文件下载而无需从Java路径中读取文件?

有没有一种方法可以过滤和打印特定的图案而无需重复代码?

有没有一种方法可以从http响应中提取JSON,而无需构建结构?

有没有一种方法可以直接使用测试夹具测试事件,而无需使用ExpectEvents?

有没有一种方法可以编辑bashrc而无需登录用户帐户

有没有一种方法可以从CGImage中读取数据而无需内部缓存?

有没有一种方法可以重写此语句而无需子查询?

有没有一种方法可以解决yB = c而无需计算正确的逆函数?

有没有一种方法可以改变颜色而无需在C ++中输出ANSI转义序列?

有没有一种方法可以扩展Spring Service以管理继承的实体,而无需复制代码?

有没有一种方法可以分配多个变量而无需手动编写它们?

有没有一种方法可以输出表达式而无需评估jupyter notebook

有没有一种方法可以为空的DataTable定义自定义html?

有没有一种方法可以为Typescript中的嵌套键访问创建类型保护?

有没有一种方法可以为类的特定属性隐藏一些枚举值?

有没有一种方法可以使用新的Injection类扩展子组件的构造函数,而无需调用super()?