首页 > 解决方案 > 在 Python 中调用延迟评估时进行评估

问题描述

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

最小工作示例:

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.

我该如何解决这个问题?

标签: pythonlazy-evaluation

解决方案


这不起作用的原因很简单。

延迟评估是由以下事实触发的,即 print 需要对象的字符串表示并因此调用函数__repr____str__DelayedEvaluation 的实例。

如果你打电话delayed_evaluation + 1,你不会触发对__repr__or的调用__str__

您可以做的是实现“+”运算符

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

如果它应该适用于其他运营商,那么您必须实现您想要处理的所有运营商。


推荐阅读