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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
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
Algorithm | Hash digest | |
---|---|---|
SHA256 |
961e2d72ff7973c62e27fce5d23a999aad7a1c3d1dd5f9acf3ef62d454342152
|
|
MD5 |
893dea681daacf5b001e549480470517
|
|
BLAKE2b-256 |
cfea4436030ce7426847bd1f9691c3386014a74361142dd8550141f81b179e5b
|
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
Algorithm | Hash digest | |
---|---|---|
SHA256 |
c4af4a5c50afde8e43e719a34a2e6a19ef881d0e3adde49ea077451c5eab9e20
|
|
MD5 |
8cc8de05f62f6f3709e4195e982e380e
|
|
BLAKE2b-256 |
225d71fcf9393feba2cf648b389b0ef35bc32ca92acbea89f9e8b2c14557e3c3
|