Skip to content

ahartlba/decorator_validation

Repository files navigation

Validation Decorators

Unittest Static Badge PyPI - Python Version Poetry PyPI Downloads

Simple and fast type-checking and parameter validation at runtime.

Install with

pip install decorator-validation

Why?

Do you want to remove visual clutter in your python function? Do you want to check types fast without a lot of boilerplate?

Then this package is right for you.

Not convinced? Check out the following:

# classic
def foo(bar: int, message: str, some_additional_info: dict):
    if not isinstance(bar, int):
        raise TypeError(...)
    if not isinstance(message, str):
        raise TypeError(...)
    if not isinstance(some_additional_info, dict):
        raise TypeError(...)
    # now begin to code...

# now
from decorator_validation import check_types

@check_types
def foo(bar: int, message: str, some_additional_info: dict):
    # begin to code

The check_types decorator takes override kwargs to overwrite the type-hints

@check_types(bar=float, message=(str, bytes))
def foo(bar: int, message: str, some_additional_info: dict):
    # begin to code

although this is more usefull to skip a check with

from decorator_validation import check_types, SkipTypeCheck

@check_types(message=SkipTypeCheck)
def foo(bar: int, message: str, some_additional_info: dict):
    # begin to code

Checkout the codebase for more examples and built in decorators!

NOTE: check_types has limitations for python versions lower than 3.10 due to lack of built in language support for type-checking. Use with caution with special types and None-Types! Furthermore wrap types inside of tuples if they are not of type type!

More Example

Of course, sometimes you want to have a custom validation method for all your inputs. It just needs to return if the input is valid or not. You can use the make_validator function to shorten the code even more.

from decorator_validation import check_types, make_validator
from pathlib import Path

@make_validator
def my_validation_func(file_path: str) -> True:
    if not isinstance(file_path, str):
        raise TypeError(...)
    if not Path(file_path).resolve().is_file():
        raise ValueError(...)

class FileReader:

    @check_types(file_path=my_validation_func)
    def __init__(self, file_path: str):
        ...

Default Validators

This Repository comes with its own default validation functions, like if an input is a valid file. A Validation function is a function that returns True of False (or raises an exception) if the input is correct / incorrect.

from decorator_validation import check_types
from decorator_validation.std_validators import is_file

class FileReader:

    @check_types(file_path=is_file)
    def __init__(self, file_path: str):
        ...

Validate Arbitrary Arguments

You can of course combine validation functions with type-check-skipping and the signature_usage. SkipTypeCheck can be used for non-supported types in type-hinting etc.

from decorator_validation import check_types, SkipTypeCheck
from decorator_validation.std_validators import is_file

class Logger:

    @check_types(file_path=is_file, message=SkipTypeCheck)
    def log(file_path: str, message: str, repeat: int = 1):
        ...

    log('some_file.txt', 'hello')  # works
    log('some_file.txt', 2)  # works
    log('some_file.txt', 2, '3')  # does not work

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages