【问题标题】:Evaluate delayed evaluation when it is called in Python在 Python 中调用延迟评估时进行评估
【发布时间】:2019-10-09 12:26:31
【问题描述】:

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

最小工作示例:

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 相同的方式“回复”。

我该如何解决这个问题?

【问题讨论】:

  • 就像附带信息一样。据我所知__repr__ 通常应该返回一个字符串而不是一个int。尽管这在许多情况下可能有效,但在其他一些情况下可能会中断。所以return str(self.__delayed_evaluation()) 可能更安全(更偏执)

标签: python lazy-evaluation


【解决方案1】:

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

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

如果您调用 delayed_evaluation + 1,您不会触发对 __repr__ 或 __str__ 的调用。

你可以做的是实现'+'操作符

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

如果它适用于其他运算符,您必须实现所有您想要处理的运算符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    • 2011-03-03
    • 2021-06-21
    • 2016-06-20
    • 1970-01-01
    相关资源
    最近更新 更多