Giter Site home page Giter Site logo

kaioretry's Introduction

KaioRetry

PyPI version Supported Python Version License PyPI - Downloads

Pylint Static Quality Github Action Mypy Static Quality Github Action Pylint Static Quality Github Action Documentation Status

KaioRetry is (yet another) retry decorator implementation, which is clearly inspired by the original retry module and is actually backward compatible with it.

Basic usage

Transparently perform retries on failures:

from kaioretry import retry, aioretry


@retry(exceptions=ValueError, tries=2)
def some_func(...):
    ...


@aioretry(exceptions=(ValueError, SomeOtherError), tries=-1, delay=1)
async def some_coroutine(...):
    ...

Documentation

If you care to read more, a more lengthy documentation is available on readthedocs.

Known Issues

Pylint

Pylint, it seems, is not really good a detecting decorators that change function signatures, and kaioretry defines and uses a lot of decorators (relatively speaking).

This means that such basic code:

from kaioretry import aioretry

@aioretry(exceptions=ZeroDivisionError)
async def func(x, y):
    return x / y

Will trigger the following pylint errors:

E1120: No value for argument 'retry_obj' in function call (no-value-for-parameter)

According to pylint documentation, the only way to widely work around this issue is to use the signature-mutators feature of pylint. This can be done either on the command line:

pylint --signature-mutators=kaioretry._make_decorator

Or through pylint configuration file:

# The TYPECHECK section accepts a signature-mutators directive.
[TYPECHECK]

# List of decorators that change the signature of a decorated function.
signature-mutators=kaioretry._make_decorator

(Of course, you can inline a # pylint: disable=no-value-for-parameter comment on all aioretry() and retry() call lines, and it can be good enough to disable a one-time warning, but repeating that line can be tedious. The signature-mutators directive will globally disable the signature-checking for aioretry() and retry() calls, so this can be easier depending of your own usage of kaioretry.)

Mypy and functions generated by kaioretry.aioretry

Mypy may incorrectly infer the type of an aioretry-decorated function as def (*Any, **Any) -> Any if the original function:

  1. is a coroutine and
  2. has a returned type hinted as Any and/or if parameters are hinted as Any.

If the original function is fully annotated as non-Any, the resulting decorated function annotations should be correctly inferred (according to kaioretry test).

It is unclear to me right now, if the kaioretry.aioretry function type hints are incorrect or if it is an issue with either mypy or cpython. Or both. Or all 3. Go figure.

Any information on that matter would be greatly appreciated. I've spent weeks trying to track down this issue. And while walking down this path has allowed me to fix some other (rather unrelated) type-hinting boo-boos from my part, this very specific issue is still puzzling me.

Feedback welcome.

Always.

kaioretry's People

Contributors

anvil avatar

Stargazers

 avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.