python - 在 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
.
我该如何解决这个问题?
解决方案
这不起作用的原因很简单。
延迟评估是由以下事实触发的,即 print 需要对象的字符串表示并因此调用函数__repr__
或__str__
DelayedEvaluation 的实例。
如果你打电话delayed_evaluation + 1
,你不会触发对__repr__
or的调用__str__
。
您可以做的是实现“+”运算符
def __add__(self,other):
return self.__delayed_evaluation() + other
如果它应该适用于其他运营商,那么您必须实现您想要处理的所有运营商。
推荐阅读
- bash - 带有只读变量的 shell 脚本“set -e”
- go - 如何同时收听两个 Golang 频道?
- visual-studio-code - 安装flutter osx错误VS代码
- python - How to include .exe, apt-get and brew install files on a PyPi setup.py file
- json - JSON decode from url in SWIFT
- c# - 为什么我的按钮不使用我创建的样式?
- python - 通过按下具有不同输入值的按钮动态调用函数
- javascript - 如何同时在 vue js 上添加两个转换?
- javascript - 代码重构。试图改进我的代码
- python-3.x - Python 硒火狐使用 .click() 选择