假设你正在发射火箭。当你上升时,你需要根据给定的表格来修正角度。但是,在某些情况下,您需要执行一次性操作(例如,释放助推器,如果它们是空的,或者抛弃某个高度的整流罩)。实现Python`when`构造的最佳方式是什么?
我现在正在做的是:
fairing_jettisoned = False
while apogee < TARGET_APOGEE:
aim_rocket(speed, altitude, apogee)
if not fairing_jettisoned and altitude > FAIRING_ALT:
jettison_fairing()
fairing_jettisoned = True
,因为你必须来回跳转这变得更复杂的程序非常繁琐。
其他语言有when
声明(when altitude > FAIRING_ALT:
),但在Python中不存在。
我试图实现它的一种方法是类。这是哈克,但它似乎运作良好:
class when(object):
calls = {}
def __init__(self, expr, func, *args, runs_left=1, **kwargs):
_, fname, line, *_ = inspect.stack()[1]
stored_instance = when.calls.get((fname, line), self)
if stored_instance == self:
self.func = func
self.args = args
self.kwargs = kwargs
self.runs_left = runs_left
when.calls[(fname, line)] = self
self = stored_instance
self.expr = expr
if self.runs_left and self.expr:
self.runs_left -= 1
return self.func(*self.args, **self.kwargs
这可以像这样运行:
while apogee < TARGET_APOGEE:
aim_rocket(speed, altitude, apogee)
when(altitude > FAIRING_ALT, jettison_fairing)
归根结底,我想是有这种语法:
while apogee < TARGET_APOGEE:
aim_rocket(speed, altitude, apogee)
when(altitude > FAIRING_ALT, runs_left=3):
# Do a bunch of things; no need for a lambda or function.
jettison_fairing()
我也尝试过使用__enter__
和__exit__
来实现它,但是我找不到一个方法来跳到__exit__
,如果它已经运行了。异步/等待可能会出现这种情况吗?或者对于完全不同的东西呢?
这似乎有点不必要,为什么不只是使用布尔值,这是在运行if语句时发生改变的,这是if语句的条件? –
这就是我现在要做的。无论是布尔还是减量计数器。但是在代码中上下移动会变得非常乏味,所以我想知道是否有更好的方法来实现它。 –
那么如果你现在正在使用这个代码正在运行,那么它似乎是一个很好的解决方案。至于将它作为关键字实现,你将不得不编写自己的Python版本(通过对CPython进行更改),我相信这绝对是不值得的。 –