Skip to main content

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} )

Metadata

Release files for valueparser 0.1.5

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for valueparser 0.1.5
File Size Uploaded
valueparser-0.1.5.tar.gz 7.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for valueparser 0.1.5
File Interpreter ABI Platform
valueparser-0.1.5-py3-none-any.whl Python 3 none any Details

Total release size: 15.5 kB

Release files / valueparser-0.1.5.tar.gz

Download URL valueparser-0.1.5.tar.gz
Size 7.8 kB
Tags Source
SHA-256 checksum
How to use checksums
961e2d72ff7973c62e27fce5d23a999aad7a1c3d1dd5f9acf3ef62d454342152
BLAKE2b-256 checksum
How to use checksums
cfea4436030ce7426847bd1f9691c3386014a74361142dd8550141f81b179e5b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.3.1 CPython/3.7.1 Darwin/21.6.0

Release files / valueparser-0.1.5-py3-none-any.whl

Download URL valueparser-0.1.5-py3-none-any.whl
Size 7.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
c4af4a5c50afde8e43e719a34a2e6a19ef881d0e3adde49ea077451c5eab9e20
BLAKE2b-256 checksum
How to use checksums
225d71fcf9393feba2cf648b389b0ef35bc32ca92acbea89f9e8b2c14557e3c3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.3.1 CPython/3.7.1 Darwin/21.6.0
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page