Skip to main content

A set of tools to create hybrid sync/async interfaces.

Project description

Xsync

PyPi version PyPI - Status Downloads GitHub last commit License

CI Maintainability Test Coverage

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:

License

The Xsync module for Python is licensed under the BSD 3-Clause License.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

xsync-0.2.1.tar.gz (8.3 kB view details)

Uploaded Source

Built Distribution

xsync-0.2.1-py3-none-any.whl (12.1 kB view details)

Uploaded Python 3

File details

Details for the file xsync-0.2.1.tar.gz.

File metadata

  • Download URL: xsync-0.2.1.tar.gz
  • Upload date:
  • Size: 8.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.0 CPython/3.9.12

File hashes

Hashes for xsync-0.2.1.tar.gz
Algorithm Hash digest
SHA256 12459785d9f2dfec79d6512e7ce4343abe71638fb59aa4ec251f48759a07c30d
MD5 9388a83c8432af75b1e39e08f8b34f54
BLAKE2b-256 14a106e731545db828481bcc724ace5b6ae439547f0a906bf86bb6728624c0a1

See more details on using hashes here.

File details

Details for the file xsync-0.2.1-py3-none-any.whl.

File metadata

  • Download URL: xsync-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 12.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.0 CPython/3.9.12

File hashes

Hashes for xsync-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 45f6295907eb9cc3647055e2bbb221eacfb46ffe7fb44b76245854ff8c1aad06
MD5 2c1e4ebd94966f627bc181e75750bd53
BLAKE2b-256 0e549340d6e4d6761ed2823f5e6a0696f5bda30c49c912d072c26eaeb151f63e

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page