Skip to main content

Python package for quick creation of tools to parse a value

Project description

Parser

Python package for quick creation/ combination of value parser object for muly-puposes

Install

> pip install valueparser

Usage

from valueparser.parsers import Bounded

value_parser = Bounded(min=0, max=1)

value_parser.parse(4.0)

# ParseError: 4.0 is higher than 1.0

Several parsers can be combined to one single parser object, they share however the same name space for configuration parameters

from valueparser import parser, Clipped, Rounded

ratio_parser = parser( (float, Clipped, Rounded),  min=0, max=1.0, ndigits=2 )

assert ratio_parser.parse( 0.231234) == 0.23 
assert ratio_parser.parse( 4.5) == 1.0 
assert ratio_parser.parse( "0.12345") == 0.12

Equivalent can be done by creating a new class

from valueparser import parser_class, Clipped, Rounded

MyParser = parser_class( (float, Clipped, Rounded), "MyParser" )
ratio_parser = MyParser( min=0, max=1, ndigits=2)

conparser works the same way than parser except it construct a typing object to be use inside pydantic BaseModel in a compact way.

from valueparser import conparser, Bounded
from pydantic import BaseModel 

Pixel =  conparser( (int, Bounded), min=0, max=1023 ) 
class Data(BaseModel):
    x: Pixel = 512
    y: Pixel = 512
   
Data(x=-200)

# 
#pydantic.error_wrappers.ValidationError: 1 validation error for Data
#x
#    -200.0 is lower than 0.0 (type=value_error.parse; error_code=Errors.OUT_OF_BOUND)

to make any function a parser (e.g. an object with parse method) one can use the parser function as well :

from valueparser import parser

float_parser = parser(float)
assert float_parser.parse("1.234") == 1.234

force_int_parser = parser( (float, int)) # parse to float then int 
assert force_int_parser.parse( "1.234") == 1

Actually the parser function accepts :

  • A Parser Class iddentified as a class with the parse method
  • A callable
  • An instance of a Parser Class
  • an mix inside an iterable

Plus any kwargs accepted by the combination of parsers

Builtin Parsers

class name kwargs comment
Bounded min=-inf, max=+inf raise an error if value outside interval else return value
Clipped min=-inf, max=+inf clip silently the value to inferior and superior bounds
Rounded ndigits=0 round the numerical value to ndigits
Formated format="%s" convert to string with the given format
Listed items=[], default_item(optional) raise error if value not in items list else return value a
default_item can be set to be returned instead of error raised
Enumerated enumerator return enumerator(value) or raise error

Create a custom parser

To create a parser one need to create a new class from BaseParser, declare any configurable argument inside the child class Config and define the static or classmethod __parse__

For instance a parser adding some noise to a value ( can be usefull for e.i. a simulator)

from valueparser import BaseParser
import random 

class Noisier(BaseParser):
    class Config:
        noise_scale = 1.0
    @staticmethod
    def __parse__( value, config):
        return value + (random.random()-0.5) * config.noise_scale

Usage :

noisier = Noisier( noise_scale=100)
x = noisier.parse(0.0)
x
36.700125482238036

Or use conparser in pydantic Model:

from valueparser import conparser 
from pydantic import BaseModel  

class MyData(BaseModel):
    x: conparser(Noisier, noise_scale=100)
    y: conparser(Noisier, noise_scale=100)

my_data = MyData(x=0, y=0)
my_data
MyData(x=32.819723479459284, y=-25.95893228872207)

Parser and Systemy

Parsers are beased on :class:systemy.System class. One can include a parser factory in a systemy class and expose the parser configuration to user.

from valueparser import ParserFactory , Bounded
from systemy import BaseSystem 
from pydantic import AnyUrl 

dummy = lambda x:x 

class Node(BaseSystem):
    class Config:
        url: AnyUrl = "http://localhost:4840"
        parser: ParserFactory = ParserFactory(type=dummy)

    def set(self, value):
        value = self.parser.parse(value) 
        # set value on server 
        return value

node = Node( parser={'type':(float,Bounded), 'min':0, 'max':10} )

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

valueparser-0.1.5.tar.gz (7.8 kB view details)

Uploaded Source

Built Distribution

valueparser-0.1.5-py3-none-any.whl (7.7 kB view details)

Uploaded Python 3

File details

Details for the file valueparser-0.1.5.tar.gz.

File metadata

  • Download URL: valueparser-0.1.5.tar.gz
  • Upload date:
  • Size: 7.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.3.1 CPython/3.7.1 Darwin/21.6.0

File hashes

Hashes for valueparser-0.1.5.tar.gz
Algorithm Hash digest
SHA256 961e2d72ff7973c62e27fce5d23a999aad7a1c3d1dd5f9acf3ef62d454342152
MD5 893dea681daacf5b001e549480470517
BLAKE2b-256 cfea4436030ce7426847bd1f9691c3386014a74361142dd8550141f81b179e5b

See more details on using hashes here.

File details

Details for the file valueparser-0.1.5-py3-none-any.whl.

File metadata

  • Download URL: valueparser-0.1.5-py3-none-any.whl
  • Upload date:
  • Size: 7.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.3.1 CPython/3.7.1 Darwin/21.6.0

File hashes

Hashes for valueparser-0.1.5-py3-none-any.whl
Algorithm Hash digest
SHA256 c4af4a5c50afde8e43e719a34a2e6a19ef881d0e3adde49ea077451c5eab9e20
MD5 8cc8de05f62f6f3709e4195e982e380e
BLAKE2b-256 225d71fcf9393feba2cf648b389b0ef35bc32ca92acbea89f9e8b2c14557e3c3

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page