funchacks
👋 Introduction
Funchacks is a fun module that provides a small package of utilities.
Dynamic signature change without compile, eval and exec? That was the main idea of the project! But this path is a little dangerous, so the part could not be implemented, but if possible it will be implemented in the next versions!
So is it worth using funchacks signature utilities?
More likely no than yes. If you want a really optimized and safe implementation of this idea, it's better to
look into makefun (this was another reason why I wanted to do a dynamic signature change without compile, eval and exec).
⚙️ Installation
pip install funchacks
🚀 Quick start
from funchacks import inspections
def foo() -> None:
some_local_var = 1
other_var = 2
>>> dict(inspections.getlocals(foo.__code__))
{"some_local_var": 1, "other_var": 2}
(!)Note: if you add positional only or positional arguments, then there must be*argsin the function signature. Accordingly, if you add keyword only or keyword arguments -**kwargs.
import inspect
from typing import Any
from funchacks import sig
@sig.change_args(
sig.posonly("first"),
sig.arg("second"),
)
def foo(*args: Any) -> None:
"""
!!! Note:
Temporarily positional only arguments are available only for
the signature, there may be errors when calling the function.
"""
>>> inspect.Signature.from_callable(foo)
(first, /, second, *args)
@sig.change_args(
sig.kwarg("first", None),
sig.kwonly("second"),
)
def bar(**kwargs: Any) -> None:
"""
!!! Note:
Temporarily keyword only arguments are available only for
the signature, there may be errors when calling the function.
"""
>>> inspect.Signature.from_callable(bar)
(first=None, *, second, **kwargs)
@sig.change_args(
sig.arg("first"),
sig.kwarg("second", None)
)
def baz(*args: Any, **kwargs: Any) -> None:
"""This should work.
But how to access the arguments? locals?...
"""
# All wrapped function has __sig__ attribute
# that contains function signature.
lvars = sig.Bind.from_locals(locals(), in_=baz)
assert lvars.args() == ["first"]
assert lvars.kwargs() == ["second"]
return lvars.get("first") + lvars.get("second")
>>> inspect.Signature.from_callable(baz)
(first, second=None, *args, **kwargs)
>>> baz(1, 2)
3
Signature from function.
def spam(a, /, b, c=None, *, d) -> None:
pass
@sig.from_function(spam)
def eggs(*args: Any, **kwargs: Any) -> None:
pass
>>> inspect.Signature.from_callable(eggs)
(a, /, b, c=None, *, d)
Metadata
Release files for funchacks 1.0.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| funchacks-1.0.1-py3-none-any.whl | Python 3 | none | any | Details for funchacks-1.0.1-py3-none-any.whl |
Release files / funchacks-1.0.1-py3-none-any.whl
| Download URL | funchacks-1.0.1-py3-none-any.whl |
|---|---|
| Size | 14.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ca65f1c3383c0d8c7484eb4c2a35bf8f05fdbecebc98560e35c00c82d6c24899
|
|
BLAKE2b-256 checksum How to use checksums |
fee1da86c0dd7c272bf42db68337cb2a8fbe9f0f35b719141406fe235c3ba5cf
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.7.1 importlib_metadata/4.10.1 pkginfo/1.8.2 requests/2.27.1 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.10
|
Security for funchacks 1.0.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.