Library for using callbacks to resume your code.
Project description
A Python library for using callbacks to resume your code.
resumeback provides a utility function decorator that enables using callback-based interfaces in a single line of execution – a single function.
Full docs are available here: http://fichtefoll.github.io/resumeback/
Installation
$ pip install resumeback
Usage
resumeback.send_self’s mechanic of sending a generator function a handle to itself is what allows for better flow control using callback-based interfaces. Essentially, it enables a single line of execution.
Following is a function that uses an asynchronous callback mechanism to signal that user input has been made:
from threading import Thread
def ask_for_user_input(question, on_done):
def watcher():
result = input(question)
on_done(result)
Thread(target=watcher).start()
The traditional way of using a function like ask_for_user_input would be to define a function of some way, either as a closure or using functools.partial so that we can preserve the state we already accumulated prior to executing said function.
For example like so:
def main():
arbitrary_value = 10
def on_done(number):
number = str(number)
print("Result:", number * arbitrary_value)
ask_for_user_input("Please enter a number", on_done)
Because Python does not have multi-line inline functions, this is rather awkward, because we are jumping from the function call of ask_for_user_input back to our previously defined function on_done – which is only ever going to be called once in this context.
However, using resumeback.send_self, we can do something to flatten our line of execution by passing a callback to resume execution in our original function:
from resumeback import send_self
@send_self
def main():
this = yield # "this" is now a reference to the just-created generator
arbitrary_value = 10
# Yield pauses execution until one of the generator methods is called,
# such as `.send`, which we provide as the callback parameter.
number = yield ask_for_user_input("Please enter a number", this.send)
number = str(number)
print("Result:", number * arbitrary_value)
Acknowledgements
Project started initially after a forum post from @Varriount on the Sublime Text forum. I just took his idea “to the next (abstraction) level” and made it more convenient to use.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for resumeback-0.1.0-py2.py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | f8c7e8e2e33b1bdbbd6b2f8657fcea3321bdd8d32a55cc314eba2ccf54959680 |
|
MD5 | 77f1ea015d8c0cac02d1caf194c95494 |
|
BLAKE2b-256 | 9fdb42c4b45e79f9aed8f3badd951f4d9298b3aac38c106467eca734636a2712 |