The RustPython Notebook is a toy notebook inspired by the now inactive Iodide project (https://alpha.iodide.io/).
Here is how it looks like:
You can use the notebook to experiment with using Python and Javascript in the browser together.
The main use case is for scientific communication where you can have:
- text or thesis in markdown,
- math with Tex,
- a model or analysis written in python,
- a user interface and interactive visualization with JS.
The Notebook loads python in your browser (so you don't have to install it) then let yous play with those languages.
Using Javascript in the browser can play to JS strength but it is also a workaround since RustPython doesn't fully implement DOM/WebAPI functionality.
To read more about the reasoning behind certain features, check the blog on https://rustpython.github.io/blog
Sample notebooks are under snippets
snippets/python-markdown-math.txt
: python, markdown and mathsnippets/python-js.txt
, adds javascriptsnippets/python-js-css-md/
adds styling with css in separate, more organized files.
- Run locally with
npm run dev
- Build with
npm run dist
// adds `values[name]` to the python scope under `name`
function injectPython(values: { [name: string]: PythonValue });
type PythonValue =
// null -> None
| null
| undefined
// n -> int(n) if Number.isInteger(n) else float(n)
| number
// s -> str(s)
| string
// typedArray -> bytes(typedArray)
| Uint8Array
// arr -> list(arr)
| Array<PythonValue>
// obj -> dict(Object.entries(obj))
| { [k: string]: PythonValue }
// js callback in python: positional args are passed as
// arguments, kwargs is the `this` variable
// f -> lambda *args, **kwargs: f.apply(kwargs, args)
//
// python callback in js: pass the positional args an array and
// kwargs as an object
// f -> (args, kwargs) => f(*args, **kwargs)
| Function;
// appends an element to the notebook
function pushNotebook(el: HTMLElement);
// find and displays the traceback of a python error from a callback
function handlePyError(err: any);
// e.g.
try {
pyCb([], {});
} catch (err) {
handlePyError(err);
}
injectPython
demo:
injectPython({
foo(a, b) {
console.log(a);
if (this.x != null) {
console.log(`got kwarg! x=${this.x}`);
}
return (y) => y + 1 + b;
},
});
adder = foo("hy from python", 3, x=[1, 2, 3])
assert adder(5) == 9
- Collaborative peer-to-peer editing with WebRTC. Think Google Doc or Etherpad editing but for code in the browser
%%load
command for dynamically adding javascript libraries or css framework- Clean up and organize the code. Seriously rethink if we want to make it more than a toy.