我正在尝试实现一个懒惰评估的str类。我现在拥有的是像
这样的东西class LazyString(object):
__class__ = str
def __init__(self, func):
self._func = func
def __str__(self):
return self._func()
在大多数情况下(我的目的)可以正常工作,除了一个:str.join
:
' '.join(['this', LazyString(lambda: 'works')])
失败
TypeError: sequence item 1: expected string, LazyString found
经过一些探讨后,似乎没有任何神奇的功能可用。 join
似乎在核心实现中是硬编码的,只有有限内置类型的实例才能使其工作而不实际成为str
。
所以我真的没有选择,或者还有另一种我不知道的方式吗?
答案 0 :(得分:2)
join
接受字符串,所以给它字符串:
' '.join(map(str, ['this', LazyString(lambda: 'works')]))
Python不支持您正在寻找的透明延迟评估。如果要强制评估惰性对象,则必须明确地执行此操作,而不是在需要时自动完成。有时,Python会调用您可以依赖的对象的某些方法,例如__nonzero__
如果您想要一个惰性布尔值,但并非总是如此,并且通常无法实现完全的互操作性。