zeroSteiner / rule-engine

A lightweight, optionally typed expression language with a custom grammar for matching arbitrary Python objects.
https://zerosteiner.github.io/rule-engine/
BSD 3-Clause "New" or "Revised" License
433 stars 54 forks source link

Add support for default_value resolver #37

Closed thedevtoni closed 2 years ago

thedevtoni commented 2 years ago

Is there any possibility of adding something like we have to resolve the types but for values?

context = rule_engine.Context(type_resolver=rule_engine.type_resolver_from_dict({
    'first_name': rule_engine.DataType.STRING,
    'age': rule_engine.DataType.FLOAT
}))
context = rule_engine.Context(type_resolver=rule_engine.value_resolver_from_dict({
    'first_name': "default",
    'age': 0
}))
zeroSteiner commented 2 years ago

Are you trying to figure out what the rule engine data type is for each of the values? If that's the case you can just pass your dictionary into type_resolver_from_dict. For every value, if it's not a datatype already, it'll be resolved to one using DataType.from_value.

In [1]: import rule_engine

In [2]: rule_engine.type_resolver_from_dict({
   ...:     'first_name': rule_engine.DataType.STRING,
   ...:     'age': rule_engine.DataType.FLOAT
   ...: })
Out[2]: functools.partial(<function _type_resolver at 0x7f3f7f1cb940>, {'first_name': <_DataTypeDef name=STRING python_type=str >, 'age': <_DataTypeDef name=FLOAT python_type=Decimal >})

In [3]: rule_engine.type_resolver_from_dict({
   ...:     'first_name': rule_engine.DataType.STRING,
   ...:     'age': rule_engine.DataType.FLOAT
   ...: })('first_name')
Out[3]: <_DataTypeDef name=STRING python_type=str >

In [4]: rule_engine.type_resolver_from_dict({
   ...:     'first_name': 'default',
   ...:     'age': 0
   ...: })('first_name')
Out[4]: <_DataTypeDef name=STRING python_type=str >

In [5]: 
thedevtoni commented 2 years ago

@zeroSteiner thanks for the guidance. I will check this part.

I end up implementing a method that returns methods with type_resolver.

In terms of performance is that better or is the dictionary solution better?

Thanks

zeroSteiner commented 2 years ago

I'm not entirely sure which option would have better performance.