在Python中调用延迟求值时求值

在Python中调用延迟求值时求值,python,lazy-evaluation,Python,Lazy Evaluation,我有一个程序,其中一个变量来自显式值或延迟求值。我希望他们在接到电话时能以同样的方式“回应” 最低工作示例: import random class DelayedEvaluation: def __init__(self, function): assert callable(function), "Input argument {} is not callable and can thus not be a delayed evaluation.".format

我有一个程序,其中一个变量来自显式值或延迟求值。我希望他们在接到电话时能以同样的方式“回应”

最低工作示例:

import random


class DelayedEvaluation:

    def __init__(self, function):
        assert callable(function), "Input argument {} is not callable and can thus not be a delayed evaluation.".format(function)
        self.__delayed_evaluation = function
        self.__class__ = type(self.__delayed_evaluation())  # Does not work!

    def __repr__(self):
        return self.__delayed_evaluation()

    def __str__(self):
        return "{}".format(self.__delayed_evaluation())


delayed_evaluation = DelayedEvaluation(lambda: 42)
print(delayed_evaluation)  # Works.
print(delayed_evaluation + 1)  # Does not work!
delayed_evaluation + 1  # Does not work!


for i in range(100):
    value = random.choice((DelayedEvaluation(lambda: 42), 43))
    print(value + 1)  # Does not work when 'value' comes from 'DelayedEvaluation'.
在上面,我尝试通过引入类
DelayedEvaluation
来实现这一点,并将其类型设置为求值时函数值的类型

我希望
DelayedEvaluation(lambda:42)
以与
43
相同的方式“响应”


如何解决这个问题?

这不起作用的原因很简单

延迟求值是由以下事实触发的:print需要对象的字符串表示形式,因此调用DelayedEvaluation实例的函数
\uuuu repr\uuu
\uu str\uu

如果调用
delayed\u evaluation+1
,则不会触发对
\uuuuu repr\uuu
\uu str\uuu
的调用

您可以实现'+'运算符

   def __add__(self,other):
         return self.__delayed_evaluation() + other

如果它适用于其他操作员,则必须实现您希望处理的所有操作员。

就像侧面信息一样。据我所知,
\uuuu repr\uuuu
通常应该返回一个字符串而不是int。尽管在许多情况下这可能有效,但在其他一些情况下可能会中断。因此,
返回str(self.\u delayed\u evaluation())