【问题标题】:Python weakref.proxy object considered iterable?Python weakref.proxy 对象被认为是可迭代的?
【发布时间】:2020-08-24 15:56:38
【问题描述】:

我遇到了以下问题(使用 Python 3.8.3):

from collections.abc import Iterable
from weakref import proxy

class Dummy:
   pass

isinstance(d := Dummy, Iterable)
# False (as expected)

isinstance(p := proxy(d), Iterable)
# True (why?!)

for _ in p:
    # raises TypeError
    pass

代理对象如何通过可迭代测试?

【问题讨论】:

    标签: python weak-references iterable


    【解决方案1】:

    它提供__iter__,以防底层类型提供它。 __iter__ 必须在类型上实现,而不是在实例上实现,所以它不能有条件地定义 __iter__ 而不分成许多不同的类,而不仅仅是一个 proxy 类。

    不幸的是,Iterable 测试只是检查类是否定义了__iter__,而不是它是否有效,proxy 不知道它是否真的在不调用包装类的 @ 987654328@。如果要检查可迭代性,只需对其进行迭代,如果失败则捕获 TypeError。如果您不能立即迭代它,而它会受到检查时间/使用时间竞争条件的影响,您可以编写自己的简单测试器来涵盖它是否可以实际上进行迭代:

    def is_iterable(maybeiter):
        try:
            iter(maybeiter)
        except TypeError:
            return False
        else:
            return True
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-26
      • 1970-01-01
      • 1970-01-01
      • 2013-08-03
      • 2021-12-13
      • 2013-12-01
      相关资源
      最近更新 更多