Xsync
A set of tools to create hybrid sync/async interfaces.
CPython versions 3.7 through 3.11-dev and PyPy versions 3.7 through 3.9 are officially supported.
Windows, MacOS, and Linux are all supported.
What does Xsync do?
Xsync allows developers to create dynamic interfaces which can be run in sync or async contexts.
In simple terms, it makes this possible:
result = my_function()
result = await my_function()
How neat is that?!
Usage
The above behaviour can be achieved with the as_hybrid decorator:
@xsync.as_hybrid()
def my_function():
...
This sets my_function up as a "hybrid callable", which is capable of being run both synchronously and asynchronously.
However, we also need to set an async implementation for my_function for it to work.
We can do this using the set_async_impl decorator:
@xsync.set_async_impl(my_function)
async def my_async_function():
...
Doing this tells Xsync to run this function instead of my_function when awaiting:
my_function() # runs as normal
await my_function() # calls `my_async_function` instead
Don't worry, my_async_function can still be run directly, as you'd expect.
It also works on methods, class methods, and static methods:
class MyClass:
@xsync.as_hybrid()
def my_method(self):
...
@xsync.set_async_impl(my_method)
async def my_async_method(self):
...
@classmethod
@xsync.as_hybrid()
def my_class_method(cls):
...
@classmethod
@xsync.set_async_impl(my_class_method)
async def my_async_class_method(cls):
...
@staticmethod
@xsync.as_hybrid()
def my_static_method(cls):
...
@staticmethod
@xsync.set_async_impl(my_static_method)
async def my_async_static_method(cls):
...
The above is the newer (and better) of two available implementations.
View the old implementation
The above behaviour can be achieved with the maybe_async decorator:
@xsync.maybe_async()
def my_function():
...
This sets my_function up as a "hybrid callable", which is capable of being run both synchronously and asynchronously.
However, we also need to set an async implementation for my_function for it to work.
We can do this by creating another function of the same name, but with an _async_ prefix:
async def _async_my_function():
...
Xsync searches for a function with the name of the original function prefixed by _async_ at runtime, and runs this instead when awaiting:
my_function() # runs as normal
await my_function() # calls `_async_my_function` instead
It also works on methods and class methods:
class MyClass:
@xsync.maybe_async()
def my_method(self):
...
async def _async_my_method(self):
...
@classmethod
@xsync.maybe_async()
def my_class_method(cls):
...
@classmethod
async def _async_my_class_method(cls):
...
This implementation does not work with static methods.
Contributing
Contributions are very much welcome! To get started:
- Familiarise yourself with the code of conduct
- Have a look at the contributing guide
License
The Xsync module for Python is licensed under the BSD 3-Clause License.
Metadata
Release files for xsync 0.2.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| xsync-0.2.1.tar.gz | 8.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| xsync-0.2.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 20.4 kB
Release files / xsync-0.2.1.tar.gz
| Download URL | xsync-0.2.1.tar.gz |
|---|---|
| Size | 8.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
12459785d9f2dfec79d6512e7ce4343abe71638fb59aa4ec251f48759a07c30d
|
|
BLAKE2b-256 checksum How to use checksums |
14a106e731545db828481bcc724ace5b6ae439547f0a906bf86bb6728624c0a1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/4.0.0 CPython/3.9.12
|
Release files / xsync-0.2.1-py3-none-any.whl
| Download URL | xsync-0.2.1-py3-none-any.whl |
|---|---|
| Size | 12.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
45f6295907eb9cc3647055e2bbb221eacfb46ffe7fb44b76245854ff8c1aad06
|
|
BLAKE2b-256 checksum How to use checksums |
0e549340d6e4d6761ed2823f5e6a0696f5bda30c49c912d072c26eaeb151f63e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/4.0.0 CPython/3.9.12
|