Metadata-Version: 2.1
Name: statics
Version: 1.0.0
Summary: Static objects in Python functions.
Author-email: Nicolas Tessore <n.tessore@ucl.ac.uk>
Requires-Python: >=3.8
Description-Content-Type: text/markdown
Classifier: License :: OSI Approved :: MIT License
Project-URL: Homepage, https://github.com/ntessore/statics
Project-URL: Issues, https://github.com/ntessore/statics/issues

statics
=======

**Static objects in Python functions**

This is a micropackage with a decorator `@static` that can be used to achieve
static objects to Python functions.  The objects can then be loaded into
variables in a function, exactly as they were given, without using globals or
closures.

How this works is probably easier shown than explained:

```py
>>> from statics import static
>>>
>>> x = 1
>>>
>>> @static(x)
... def f():
...     x = "__static__"
...     print(f"{x=}")
...
>>> del x
>>>
>>> f()
x=1

```

Multiple static objects can be declared and assigned as a tuple:

```py
>>> x, y, z = 1, 2, 3
>>>
>>> @static(x, y, z)
... def f():
...     x, y, z = "__static__"
...     print(f"{x=}, {y=}, {z=}")
...
>>> del x, y, z
>>>
>>> f()
x=1, y=2, z=3

```

Static names in the function do not have to match the names outside the
function:

```py
>>> x, y, z = 1, 2, 3
>>>
>>> @static(x, y, z)
... def f():
...     a, b, c = "__static__"
...     print(f"{a=}, {b=}, {c=}")
...
>>> del x, y, z
>>>
>>> f()
a=1, b=2, c=3

```

Technically, the static binding is achieved by storing the objects in the
`co_const` array of a Python function's code object.  Loading the variables
works by replacing the string literal `"__static__"` with the static objects.
The string `"__static__"` can therefore not be used for anything else in the
decorated function (but strings containing  `"__static__"` as a substring are
not affected).

