在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())