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
parsemethod - 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)
| File | Size | Uploaded | |
|---|---|---|---|
| valueparser-0.1.5.tar.gz | 7.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| 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
|