簡體   English   中英

實現Python`time`構造的最佳方法是什么?

[英]What is the best way to implement a Python `when` construct?

假設你正在發射一枚火箭。 當你提升時,你需要根據給定的表來固定角度。 但是,在某些時候,您需要執行一次性操作(如果它們是空的,則釋放助推器,或者例如在某個高度放棄整流罩)。

我現在正在做的是:

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中不存在。

我嘗試實現它的一種方法是使用類。 這很hacky,但似乎運作良好:

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__的方法。 async / await可以實現這樣的功能嗎? 或者是完全不同的東西?

您可以嘗試使用線程設置某些內容,例如:

from threading import Thread
import time, random

def when(condition, action) -> Thread:
    def threadtask():
        while not condition():
            time.sleep(0.5)
        action()
    t = Thread(target = threadtask)
    t.start()
    return t

altitude = 1
def jettison_fairing():
    print("Jettison the fairing!")
when(lambda: altitude > 500, jettison_fairing)
while altitude < 1000:
    time.sleep(1)
    altitude += random.randint(0,300)
    print("Altitude is now ",altitude)

# Output:

##Altitude is now  173
##Altitude is now  290
##Altitude is now  370
##Altitude is now  395
##Altitude is now  464
##Altitude is now  564
##Jettison the fairing!
##Altitude is now  736
##Altitude is now  762
##Altitude is now  1057

對於獎勵積分,你可以寫一個裝飾者來做到這一點。

然而。 您所描述的是編程實時系統所面臨的一些問題。 沒有簡單的“何時”構造可以解決您的問題。 “何時”對您意味着什么 - 例如,程序檢查高度的頻率如何? 如果您的程序同時等待五十個不同的“何時”條件,那么哪些優先級更高? 如果兩個“何時”條件同時發生,並且一組代碼告訴計算機拋棄整流罩而另一組假設它仍然存在,會發生什么?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM