Skip to main content

Simple and readable Pure Python callbacks!

Project description

callpyback

Python Versions Build Status Coverage Status PyPI version Known Vulnerabilities Maintainability Issues License: MIT Code style: black  Repo Size Downloads Project Status: Active Commit activity

Features

  • Support on_call, on_success, on_failure and on_end callbacks
  • Option to specify default return from the decorated function
  • Option to pass local scope variables of the decorated function to the on_end callback
  • Option to specify exception classes to be expected and invoke on_failure callback
  • Option to omit callbacks - default callback
  • Option to omit callback's function parameters (specify only those which you need)
  • Option to execute callbacks on the background (new thread) via @background_callpyback decorator

Instalation

Package is currently available under the same name at PyPI version.

pip install callpyback

(back to top)

Usage

1. Decorating the function with CallPyBack class decorator with callback functions specified

def on_success(func_result):
    print(f'Done with a result: {func_result}!')

def on_failure(func_exception):
    print(f'Failed with an error: {func_exception}!')


@CallPyBack(on_success=on_success, on_failure=on_failure)
def method()
    pass

method()

2. Preconfigured CallPyBack callback custom class

def on_success(func_result):
    print(f'Done with a result: {func_result}!')

def on_failure(func_exception):
    print(f'Failed with an error: {func_exception}!')

custom_callpyback = CallPyBack(
    on_success=on_success,
    on_failure=on_failure
)

@custom_callpyback
def method():
    pass

method()

3. Using @background_callpyback decorator to make callback execute on the background thread

@background_callpyback
def on_success(func_result):
    print(f'Done with a result: {func_result}!')

def on_failure(func_exception):
    print(f'Failed with an error: {func_exception}!')

custom_callpyback = CallPyBack(
    on_success=on_success,
    on_failure=on_failure
)

@custom_callpyback
def method():
    pass

method()

In this case, on_success will be executed on the background thread, while on_failure will be executed in a blocking way.

4. Passing local variables of decorated function, specified in pass_vars to on_end callback

def on_end(func_result, func_scope_vars):
    print(f'Done with a result: {func_result}!')
    print(f'Local function variables: {func_scope_vars}')

custom_callpyback = CallPyBack(
    on_end=on_end,
    pass_vars=('a', 'b')
)

@custom_callpyback
def method():
    a = 0
    b = 1
    return a

method()

5. Specifiyng default return value by default_return parameter.

custom_callpyback = CallPyBack(
    default_return=-1
)

@custom_callpyback
def method():
     raise KeyError('fail')

result = method()

In this case, result will be equal to -1 specified in default_return.

6. Specifiyng exception classes to be caught by exception_classes parameter.

def on_failure(func_exception):
    print(f'Failed with an error: {func_exception}!')

custom_callpyback = CallPyBack(
    on_failure=on_failure,
    exception_classes=(TypeError,)
)

@custom_callpyback
def method():
     raise KeyError('fail')

result = method()

In this case, exception will be raised, which will not execute failure handler, but re-raise original exception.

(back to top)

Roadmap

  • Add Changelog
  • Support on_call, on_success, on_failure and on_end callbacks
  • Option to specify default return from the decorated function
  • Option to pass local scope variables of the decorated function to the on_end callback
  • Option to specify exception classes to be expected and invoke on_failure callback
  • Option to omit callbacks - default callback
  • Option to omit callback's function parameters (specify only those which you need)
  • Option to execute callbacks on the background (new thread) via @background_callpyback decorator
  • Add asyncio support for decorated function
  • Add asyncio support for callback function
  • TBD...

See the open issues for a full list of proposed features (and known issues).

(back to top)

Contributing

Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are greatly appreciated.

If you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the tag "enhancement". Don't forget to give the project a star! Thanks again!

  1. Fork the Project
  2. Create your Feature Branch (git checkout -b feature/feature-name)
  3. Commit your Changes (git commit -m 'Add some FeatureName')
  4. Push to the Branch (git push origin feature/feature-name)
  5. Open a Pull Request
  6. Let us review your magical feature

(back to top)

License

Distributed under the MIT License. See LICENSE.txt for more information.

(back to top)

Contact

Samuel Gregorovič - samuel-gregorovic - samuelgregorovic@gmail.com

Project Link: https://github.com/samuelgregorovic/callpyback

(back to top)

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

callpyback-1.0.1.tar.gz (14.6 kB view hashes)

Uploaded Source

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