【问题标题】: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