Gibt es eine einfache Möglichkeit in Python zu warten, bis bestimmte Bedingung wahr ist?

Ich muss in einem Drehbuch warten, bis eine bestimmte Anzahl von Bedingungen wahr wird?

Ich weiß, dass ich mein eigenes Eventing mit Zustandsvariablen und Freunden rollen kann, aber ich möchte nicht alle Schwierigkeiten machen, es zu implementieren, da einige Objekteigenschaftsänderungen von einem externen Thread in einer eingewickelten C ++ – Bibliothek (Boost.Python) kommen, So kann ich nicht einfach __setattr__ in einer Klasse __setattr__ und dort eine Bedingungsvariable setzen, die mich entweder mit dem Versuch, eine Python-Bedingungsvariable aus C ++ zu erstellen und zu signalisieren, oder eine native zu wickeln und in Python zu warten Ton fiddly, unnötig kompliziert und langweilig.

Gibt es einen einfacheren Weg, es zu tun, ohne die endgültige Abfrage der Bedingung zu beenden?

Idealerweise wäre es im Sinne von

 res = wait_until(lambda: some_predicate, timeout) if (not res): print 'timed out' 

3 Solutions collect form web for “Gibt es eine einfache Möglichkeit in Python zu warten, bis bestimmte Bedingung wahr ist?”

Leider ist die einzige Möglichkeit, Ihre Einschränkungen zu erfüllen, regelmäßig abzutragen , zB …:

 import time def wait_until(somepredicate, timeout, period=0.25, *args, **kwargs): mustend = time.time() + timeout while time.time() < mustend: if somepredicate(*args, **kwargs): return True time.sleep(period) return False 

oder dergleichen. Dies kann in vielerlei Hinsicht optimiert werden, wenn etwas somepredicate kann (zB wenn es bekannt ist, ein and von mehreren Klauseln zu sein, vor allem, wenn einige der Klauseln wiederum einer Optimierung unterworfen werden, indem sie über threading.Event s oder was auch immer, Etc), aber in den allgemeinen Begriffen, die Sie bitten, ist dieser ineffiziente Ansatz der einzige Ausweg.

Sie haben grundsätzlich Ihre eigene Frage beantwortet: Nein.

Da es sich um externe Bibliotheken in boost.python handelt, die Objekte in ihrer Freizeit ändern können, musst du entweder diese Routinen eine Event-Handler-Aktualisierung aufrufen oder mit einer Bedingung arbeiten.

Hier ist die Threading-Erweiterung zu Alex's Lösung:

 import time import threading # based on https://stackoverflow.com/a/2785908/1056345 def wait_until(somepredicate, timeout, period=0.25, *args, **kwargs): must_end = time.time() + timeout while time.time() < must_end: if somepredicate(*args, **kwargs): return True time.sleep(period) return False def wait_until_par(*args, **kwargs): t = threading.Thread(target=wait_until, args=args, kwargs=kwargs) t.start() print ('wait_until_par exits, thread runs in background') def test(): print('test') wait_until_par(test, 5) 
Python ist die beste Programmiersprache der Welt.