Skip to main content

Easy make mini-languages to do python things.

Project description

verb

Easy make mini-languages to do python things.

To install: pip install verb

A quick intro to Command

from pprint import pprint
from functools import partial
import json
import operator as o
from verb import *
from lined import Pipe  # lined is installed with verb

print_jdict = Pipe(partial(json.dumps, indent=2), print)
# In a nutshell, you make a str-to-func mapping (or use the default)

func_of_op_str = {  # Note: Order represents precedence!
    '-': o.sub,
    '+': o.add,
    '*': o.mul,
    '/': o.truediv,
}

# You give it a command string

command_str = '1 + 2 - 3 * 4 / 5'
command = Command(command_str, func_of_op_str)

# You execute the command
command()
0.5999999999999996

It may be useful to see what the operation structure looks like

d = command.to_dict()
d
{'-': ({'+': (1, 2)}, {'*': (3, {'/': (4, 5)})})}
# Or if you read better with indents
print_jdict(d)
{
  "-": [
    {
      "+": [
        1,
        2
      ]
    },
    {
      "*": [
        3,
        {
          "/": [
            4,
            5
          ]
        }
      ]
    }
  ]
}

That same dict can be used as a parameter to make the same command

command = Command(d, func_of_op_str)
command()
0.5999999999999996

Example: Table Selector Mini Language

import operator as o
from typing import Callable, Mapping
from functools import partial

import pandas as pd
from lined import Pipe
from verb import str_to_basic_pyobj, Command


dflt_func_of_op_str_for_table_selection = {  # Note: Order represents precedence!
    '&': o.__and__,
    '==': o.__eq__,
    '<=': o.__le__,
    '>=': o.__ge__,
    '<': o.__lt__,
    '>': o.__gt__,
}


def mk_table_selector(
    table: pd.DataFrame,
    func_of_op_str: Mapping[str, Callable] = dflt_func_of_op_str_for_table_selection
):

    def leaf_processor(x):
        x = str_to_basic_pyobj(x)
        if x in df:
            return df[x]
        return x

    run_command = Pipe(
        partial(
            Command.from_string,
            func_of_op_str=func_of_op_str,
            leaf_processor=leaf_processor
        ),
        lambda f: f(),
        lambda idx: df[idx],
    )

    return run_command
import pandas as pd

# from mongodol.tests import data
# data.nums_and_lans

df = pd.DataFrame(
    [{'source': 'audio', 'bt': 5, 'tt': 7, 'annot': 'cat'},
     {'source': 'audio',
        'bt': 6,
        'tt': 9,
        'annot': 'dog',
        'comments': 'barks and chases cat away'},
        {'source': 'visual', 'bt': 5, 'tt': 8, 'annot': 'cat'},
        {'source': 'visual',
         'bt': 6,
         'tt': 15,
         'annot': 'dog',
         'comments': 'dog remains in view after bark ceases'}]
)
df
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
source bt tt annot comments
0 audio 5 7 cat NaN
1 audio 6 9 dog barks and chases cat away
2 visual 5 8 cat NaN
3 visual 6 15 dog dog remains in view after bark ceases
run_command = mk_table_selector(df)
run_command('source == audio')
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
source bt tt annot comments
0 audio 5 7 cat NaN
1 audio 6 9 dog barks and chases cat away
run_command('tt <= 8')
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
source bt tt annot comments
0 audio 5 7 cat NaN
2 visual 5 8 cat NaN
run_command('source == audio & tt <= 8')
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
source bt tt annot comments
0 audio 5 7 cat NaN

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

verb-0.0.2.tar.gz (6.3 kB view hashes)

Uploaded Source

Built Distribution

verb-0.0.2-py3-none-any.whl (9.3 kB view hashes)

Uploaded Python 3

Supported by

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