Module pedantic.examples.validate

Functions

def my_algorithm(value: float,
config: Configuration) ‑> float
Expand source code
@validate(ConfigFromEnvVar(name='config', validators=[ConfigurationValidator()]), strict=False, return_as=ReturnAs.KWARGS_WITH_NONE)
# @validate(ConfigFromFile(name='config', validators=[ConfigurationValidator()]), strict=False)

# with strict_mode = True (which is the default)
# you need to pass a Parameter for each parameter of the decorated function
# @validate(
#     Parameter(name='value', validators=[Min(5, include_boundary=False)]),
#     ConfigFromFile(name='config', validators=[ConfigurationValidator()]),
# )
def my_algorithm(value: float, config: Configuration) -> float:
    """
        This method calculates something that depends on the given value with considering the configuration.
        Note how well this small piece of code is designed:
            - Fhe function my_algorithm() need a Configuration but has no knowledge where this come from.
            - Furthermore, it need does not care about parameter validation.
            - The ConfigurationValidator doesn't now anything about the creation of the data.
            - The @validate decorator is the only you need to change, if you want a different configuration source.
    """
    print(value)
    print(config)
    return value

This method calculates something that depends on the given value with considering the configuration. Note how well this small piece of code is designed: - Fhe function my_algorithm() need a Configuration but has no knowledge where this come from. - Furthermore, it need does not care about parameter validation. - The ConfigurationValidator doesn't now anything about the creation of the data. - The @validate decorator is the only you need to change, if you want a different configuration source.

Classes

class ConfigFromEnvVar (name: str,
value_type: Type[bool | int | float | str | dict | list] = None,
validators: Iterable[Validator] = None,
default: Any = pedantic.decorators.fn_deco_validate.parameters.abstract_parameter.NoValue,
required: bool = True)
Expand source code
class ConfigFromEnvVar(ExternalParameter):
    """ Reads the configuration from environment variables. """

    @overrides(ExternalParameter)
    def has_value(self) -> bool:
        return 'iterations' in os.environ and 'max_error' in os.environ

    @overrides(ExternalParameter)
    def load_value(self) -> Configuration:
        return Configuration(
            iterations=int(os.environ['iterations']),
            max_error=float(os.environ['max_error']),
        )

Reads the configuration from environment variables.

Ancestors

Inherited members

class ConfigFromFile (name: str,
value_type: Type[bool | int | float | str | dict | list] = None,
validators: Iterable[Validator] = None,
default: Any = pedantic.decorators.fn_deco_validate.parameters.abstract_parameter.NoValue,
required: bool = True)
Expand source code
class ConfigFromFile(ExternalParameter):
    """ Reads the configuration from a config file. """

    @overrides(ExternalParameter)
    def has_value(self) -> bool:
        return os.path.isfile('config.csv')

    @overrides(ExternalParameter)
    def load_value(self) -> Configuration:
        with open(file='config.csv', mode='r') as file:
            content = file.readlines()
            return Configuration(
                iterations=int(content[0].strip('\n')),
                max_error=float(content[1]),
            )

Reads the configuration from a config file.

Ancestors

Inherited members

class Configuration (iterations: int, max_error: float)
Expand source code
@dataclass(frozen=True)
class Configuration:
    iterations: int
    max_error: float

Configuration(iterations: int, max_error: float)

Instance variables

var iterations : int

The type of the None singleton.

var max_error : float

The type of the None singleton.

class ConfigurationValidator
Expand source code
class ConfigurationValidator(Validator):
    @overrides(Validator)
    def validate(self, value: Configuration) -> Configuration:
        if value.iterations < 1 or value.max_error < 0:
            self.raise_exception(msg=f'Invalid configuration: {value}', value=value)

        return value

Helper class that provides a standard way to create an ABC using inheritance.

Ancestors

Inherited members