【发布时间】: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())可能更安全(更偏执)