async-property 0.2.2


pip install async-property

  Latest version

Released: Jul 03, 2023

Project Links

Meta
Author: Ryan Anguiano

Classifiers

Development Status
  • 4 - Beta

Intended Audience
  • Developers

License
  • OSI Approved :: MIT License

Natural Language
  • English

Programming Language
  • Python :: 3
  • Python :: 3.7
  • Python :: 3.8
  • Python :: 3.9
  • Python :: 3.10
  • Python :: 3.11

Topic
  • Software Development
  • Utilities

async_property

https://img.shields.io/pypi/v/async_property.svg https://app.travis-ci.com/ryananguiano/async_property.svg?branch=master Documentation Status Updates

Python decorator for async properties.

Install

To install async_property, run this command in your terminal:

$ pip install async-property

Or if you have pipenv:

$ pipenv install async-property

Usage

You can use @async_property just as you would with @property, but on an async function.

class Foo:
    @async_property
    async def remote_value(self):
        return await get_remote_value()

The property remote_value now returns an awaitable coroutine.

instance = Foo()
await instance.remote_value

Cached Properties

@async_cached_property will call the function only once. Subsequent awaits to the property will return a cached value.

class Foo:
    @async_cached_property
    async def value(self):
        print('loading value')
        return 123

>>> instance = Foo()
>>> instance.value
<AwaitableOnly "Foo.value">

>>> await instance.value
loading value
123
>>> await instance.value
123
>>> instance.value
123

>>> instance.value = 'abc'
>>> instance.value
'abc'
>>> await instance.value
'abc'

>>> del instance.value
>>> await instance.value
loading value
123

AwaitLoader

If you have an object with multiple cached properties, you can subclass AwaitLoader. This will make your class instances awaitable and will load all @async_cached_property fields concurrently. AwaitLoader will call await instance.load(), if it exists, before loading properties.

class Foo(AwaitLoader):
    async def load(self):
        print('load called')

    @async_cached_property
    async def db_lookup(self):
        return 'success'

    @async_cached_property
    async def api_call(self):
        print('calling api')
        return 'works every time'

>>> instance = await Foo()
load called
calling api
>>> instance.db_lookup
'success'
>>> instance.api_call
'works every time'

Features

  • Both regular and cached property.

  • Cached properties can be accessed multiple times without repeating function call.

  • Uses asyncio.Lock to ensure cached functions are called only once.

  • Full test coverage with py.test

Credits

This package was created with Cookiecutter and the audreyr/cookiecutter-pypackage project template.

The ObjectProxy class was taken from wrapt library by Graham Dumpleton.

History

0.2.2 (2023-07-03)

  • Add Python 3.11 support and drop Python 3.6.

0.2.1 (2019-04-13)

  • Update docs and readme

0.2.0 (2019-04-12)

  • Use instance state to hold cache and locks

0.1.4 (2019-04-12)

  • Fix inheritance issues on AwaitLoader

0.1.3 (2019-04-12)

  • Cleanup code

0.1.2 (2019-04-12)

  • Fix asyncio.Lock issues

0.1.1 (2019-04-11)

  • Complete test coverage and update readme

0.1.0 (2019-04-11)

  • First release on PyPI.

Wheel compatibility matrix

Platform Python 2 Python 3
any

Files in release

No dependencies