是否可以代理Python str并使连接工作?

时间:2013-12-14 12:14:08

标签: python

我正在尝试实现一个懒惰评估的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

所以我真的没有选择,或者还有另一种我不知道的方式吗?

1 个答案:

答案 0 :(得分:2)

join接受字符串,所以给它字符串:

' '.join(map(str, ['this', LazyString(lambda: 'works')]))

Python不支持您正在寻找的透明延迟评估。如果要强制评估惰性对象,则必须明确地执行此操作,而不是在需要时自动完成。有时,Python会调用您可以依赖的对象的某些方法,例如__nonzero__如果您想要一个惰性布尔值,但并非总是如此,并且通常无法实现完全的互操作性。