cexprtk


Namecexprtk JSON
Version 0.4.1 PyPI version JSON
download
home_pagehttps://github.com/mjdrushton/cexprtk
SummaryMathematical expression parser: cython wrapper around the 'C++ Mathematical Expression Toolkit Library'
upload_time2023-04-12 22:24:30
maintainer
docs_urlNone
authorM.J.D. Rushton
requires_python
licenseCPL
keywords math formula parser arithmetic evaluate
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # cexprtk: Mathematical Expression Parsing and Evaluation in Python

`cexprtk` is a cython wrapper around the "[ExprTK: C++ Mathematical Expression  Toolkit Library ][ExprTK]"  by Arash Partow. Using `cexprtk` a powerful mathematical expression engine can be incorporated into your python project.

## Table of Contents

- [Installation](#installation)
- [Usage](#usage)
  - [Example: Evaluate a simple equation](#example-evaluate-a-simple-equation)
  - [Example: Using Variables](#example-using-variables)
  - [Example: Re-using expressions](#example-re-using-expressions)
  - [Example: Defining custom functions](#example-defining-custom-functions)
  - [Example: Defining an unknown symbol resolver](#example-defining-an-unknown-symbol-resolver)
  - [Example: expressions that contain return statements to produce multiple values](#example-expressions-that-contain-return-statements-to-produce-multiple-values)
- [API Reference](#api-reference)
  - [Class Reference](#class-reference)
    - [class Expression:](#class-expression)
      - [Defining unknown symbol-resolver:](#defining-unknown-symbol-resolver)
      - [def __init__(self, *expression*, *symbol_table*, *unknown_symbol_resolver_callback* = None):](#def-__init__self-expression-symbol_table-unknown_symbol_resolver_callback--none)
      - [def results(self):](#def-resultsself)
      - [def value(self):](#def-valueself)
      - [def __call__(self):](#def-__call__self)
      - [symbol_table](#symbol_table)
    - [class Symbol_Table:](#class-symbol_table)
      - [def __init__(self, *variables*, *constants* = {}, *add_constants* = False, functions = {}):](#def-__init__self-variables-constants---add_constants--false-functions--)
      - [variables](#variables)
      - [constants](#constants)
      - [functions](#functions)
    - [class USRSymbolType:](#class-usrsymboltype)
      - [VARIABLE](#variable)
      - [CONSTANT](#constant)
  - [Utility Functions](#utility-functions)
    - [def check_expression (*expression*)](#def-check_expression-expression)
    - [def evaluate_expression (*expression*, *variables*)](#def-evaluate_expression-expression-variables)
- [Authors](#authors)
- [License](#license)

## Installation

The latest version of `cexprtk` can be installed using [pip][pip] :

```bash
	$ pip install cexprtk
```

__Note:__ Installation requires a compatible C++ compiler to be installed (unless installing from a binary wheel).


## Usage

The following examples show the major features of `cexprtk`. 

### Example: Evaluate a simple equation

The following shows how the arithmetic expression `(5+5) * 23` can be evaluated:

```python
	>>> import cexprtk
	>>> cexprtk.evaluate_expression("(5+5) * 23", {})
	230.0
```

### Example: Using Variables

Variables can be used within expressions by passing a dictionary to the `evaluate_expression` function. This maps variable names to their values. The expression from the previous example can be re-calculated using variable values:

```python
	>>> import cexprtk
	>>> cexprtk.evaluate_expression("(A+B) * C", {"A" : 5, "B" : 5, "C" : 23})
	230.0
```

### Example: Re-using expressions
When using the `evaluate_expression()` function, the mathematical expression is parsed, evaluated and then immediately thrown away. This example shows how to re-use an `Expression` for multiple evaluations.

* An expression will be defined to calculate the circumference of circle, this will then be re-used to calculate the value for several different radii.
* First a `Symbol_Table` is created containing a variable `r` (for radius), it is also populated with some useful constants such as π.

```python
	>>> import cexprtk
	>>> st = cexprtk.Symbol_Table({'r' : 1.0}, add_constants= True)
```

* Now an instance of `Expression` is created, defining our function:

```python
	>>> circumference = cexprtk.Expression('2*pi*r', st)
```

* The `Symbol_Table` was initialised with `r=1`, the expression can be evaluated for this radius simply by calling it:

```python
	>>> circumference()
	6.283185307179586
```

* Now update the radius to a value of 3.0 using the dictionary like object returned by the `Symbol_Table`'s `.variables` property:

```python
	>>> st.variables['r'] = 3.0
	>>> circumference()
	18.84955592153876
```

### Example: Defining custom functions
Python functions can be registered with a `Symbol_Table` then used in an `Expression`. In this example a custom function will be defined which produces a random number within a given range.

A suitable function exists in the `random` module, namely `random.uniform`. As this is an instance method it needs to be wrapped in function:

```python
>>> import random
>>> def rnd(low, high):
...   return random.uniform(low,high)
...
```

Our `rnd` function now needs to be registered with a `Symbol_Table`:

```python
>>> import cexprtk
>>> st = cexprtk.Symbol_Table({})
>>> st.functions["rand"] = rnd
```

The `functions` property of the `Symbol_Table` is accessed like a dictionary. In the preceding code snippet, a symbol table is created and then the `rnd` function is assigned to the `rand` key. This key is used as the function's name in a `cexprtk` expression. The key cannot be the same as an existing variable, constant or reserved function name.

The `rand` function will now be used in an expression. This expression chooses a random number between 5 and 8 and then multiplies it by 10. The followin snippet shows the instantiation of the `Expression` which is then evaluated a few times. You will probably get different numbers out of your expression than shown, this is because your random number generator will have been initialised with a different seed than used in the example.

```python
>>> e = cexprtk.Expression("rand(5,8) * 10", st)
>>> e()
61.4668441077191
>>> e()
77.13523163246415
>>> e()
59.14881842716157
>>> e()
69.1476535568958
```

### Example: Defining an unknown symbol resolver
A callback can be passed to the `Expression` constructor through the `unknown_symbol_resolver_callback` parameter. This callback is invoked during expression parsing when a variable or constant is encountered that isn't in the `Symbol_Table` associated with the `Expression`. 

The callback can be used to provide some logic that leads to a new symbol being registered or for an error condition to be flagged.

__The Problem:__ The following example shows a potential use for the symbol resolver:

* An expression contains variables of the form `m_VARIABLENAME` and `f_VARIABLENAME`.
* `m_` or `f_` prefix the  actual variable name (perhaps indicating gender).
* `VARIABLENAME` should be used to look up the desired value in a dictionary.
* The dictionary value of `VARIABLENAME` should then be weighted according to its prefix:
	+ `m_` variables should be multiplied by 0.8.
	+ `f_` variables should be multiplied by 1.1.

__The Solution:__

* First the `VARIABLENAME` dictionary is defined:
	
	```python
	variable_values = { 'county_a' : 82, 'county_b' : 76}
	```

* Now the callback is defined. This takes a single argument, *symbol*, which gives the name of the missing variable found in the expression:

	```python
	def callback(symbol):
		# Tokenize the symbol name into prefix and VARIABLENAME components.
		prefix,variablename = symbol.split("_", 1)
		# Get the value for this VARIABLENAME from the variable_values dict
		value = variable_values[variablename]
		# Find the correct weight for the prefix
		if prefix == 'm':
			weight = 0.8
		elif prefix == 'f':
			weight = 1.1
		else:
			# Flag an error condition if prefix not found.
			errormsg = "Unknown prefix "+ str(prefix)
			return (False, cexprtk.USRSymbolType.VARIABLE, 0.0, errormsg)
		# Apply the weight to the 
		value *= weight
		# Indicate success and return value to cexprtk
		return (True, cexprtk.USRSymbolType.VARIABLE, value, "")
	```

* All that remains is to register the callback with an instance of `Expression` and to evaluate an expression. The expression to be evaluated is:
	- `(m_county_a - f_county_b)`
	- This should give a value of `(0.8*82) - (1.1*76) = -18`

	```python
		>>> st = cexprtk.Symbol_Table({})
		>>> e = cexprtk.Expression("(m_county_a - f_county_b)", st, callback)
		>>> e.value()
		-18.0
	```

### Example: expressions that contain return statements to produce multiple values

Exprtk expressions can return multiple values the results these expressions can be accessed through the `results()` method.

The following example shows the result of adding a constant value to a vector containing numbers:

```python
	>>> st = cexprtk.Symbol_Table({})
	>>> e = cexprtk.Expression("var v[3] := {1,2,3}; return [v+1];", st)
	>>> e.value()
	nan
	>>> e.results()
	[[2.0, 3.0, 4.0]]
```
Note that expression has to be evaluated before calling the `results()` method.

The value accessed through `results()` can contain a mixture of strings, vectors and real values:

```python
	>>> st = cexprtk.Symbol_Table({'c' : 3})
	>>> e = cexprtk.Expression("if(c>1){return ['bigger than one', c];} else { return ['not bigger than one',c];};",st)
	>>> e.value()
	nan
	>>> e.results()
	['bigger than one', 3.0]
	>>> st.variables['c']=0.5
	>>> e.value()
	nan
	>>> e.results()
	['not bigger than one', 0.5]
```

---

## API Reference

For information about expressions supported by `cexprtk` please refer to the original C++ [ExprTK][] documentation:

### Class Reference

#### class Expression:
Class representing mathematical expression.

* Following instantiation, the expression is evaluated calling the expression or invoking its `value()` method.
* The variable values used by the Expression can be modified through the `variables` property of the `Symbol_Table` instance associated with the expression. The `Symbol_Table` can be accessed using the `Expression.symbol_table` property.

##### Defining unknown symbol-resolver:

The `unknown_symbol_resolver_callback` argument  to the `Expression`
constructor accepts a callable which is invoked  whenever a symbol (i.e. a
variable or a constant), is not found in the `Symbol_Table` given by the
`symbol_table` argument. The `unknown_symbol_resolver_callback` can be
used to provide a value for the missing value or to set an error condition.

The callable should have following signature:

```python
	def callback(symbol_name):
		...
```

Where `symbol_name` is a string identifying the missing symbol.

The callable should return a tuple of the form:

```python
	(HANDLED_FLAG, USR_SYMBOL_TYPE, SYMBOL_VALUE, ERROR_STRING)
```

Where:

* `HANDLED_FLAG` is a boolean:
	+ `True` indicates that callback was able handle the error condition and that `SYMBOL_VALUE` should be used for the missing symbol. 
	+ `False`, flags and error condition, the reason why the unknown symbol could not be resolved by the callback is described by `ERROR_STRING`.
* `USR_SYMBOL_TYPE` gives type of symbol (constant or variable) that should be added to the `symbol_table` when unkown symbol is resolved. Value should be one of those given in `cexprtk.USRSymbolType`. e.g.
	+ `cexprtk.USRSymbolType.VARIABLE`  
	+ `cexprtk.USRSymbolType.CONSTANT`  
* `SYMBOL_VALUE`, floating point value that should be used when resolving missing symbol.
* `ERROR_STRING` when `HANDLED_FLAG` is `False` this can be used to describe error condition.

##### def __init__(self, *expression*, *symbol_table*, *unknown_symbol_resolver_callback* = None):
Instantiate `Expression` from a text string giving formula and `Symbol_Table`
instance encapsulating variables and constants used by the expression.

__Parameters:__

* __expression__ (*str*) String giving expression to be calculated.
* __symbol_table__ (*Symbol_Table*) Object defining variables and constants.
* __unknown_symbol_resolver_callback__ (*callable*)  See description above.

##### def results(self):
If an expression contains a `return []` statement, the returned values are accessed using this method. 

A python list is returned which may contain real values, strings or vectors.

**Note:** the expression should be evaluated by calling `value()` before trying to access results.

__Returns:__

* (*list*) List of values produced by expression's `return` statement.

##### def value(self):
Evaluate expression using variable values currently set within associated `Symbol_Table`

__Returns:__

* (*float*) Value resulting from evaluation of expression.

##### def __call__(self):
Equivalent to calling `value()` method.

__Returns:__

* (*float*) Value resulting from evaluation of expression.

##### symbol_table
Read only property that returns `Symbol_Table` instance associated with this expression.

__Returns:__

* (*Symbol_Table*) `Symbol_Table` associated with this `Expression`.

---

#### class Symbol_Table:
Class for providing variable and constant values to `Expression` instances.


##### def __init__(self, *variables*, *constants* = {}, *add_constants* = False, functions = {}, *string_variables* = {}):
Instantiate `Symbol_Table` defining variables and constants for use with `Expression` class.

__Example:__

* To instantiate a `Symbol_Table` with:
	+ `x = 1`
	+ `y = 5`
	+ define a constant `k = 1.3806488e-23`
* The following code would be used:

	```python
		st = cexprtk.Symbol_Table({'x' : 1, 'y' : 5}, {'k'= 1.3806488e-23})
	```

__Parameters:__

* __variables__ (*dict*) Mapping between variable name and initial variable value.
* __constants__ (*dict*) Dictionary containing values that should be added to `Symbol_Table` as constants. These can be used a variables within expressions but their values cannot be updated following `Symbol_Table` instantiation.
* __add_constants__ (*bool*) If `True`, add the standard constants `pi`, `inf`, `epsilon` to the 'constants' dictionary before populating the `Symbol_Table`
* __functions__ (*dict*) Dictionary containing custom functions to be made available to expressions. Dictionary keys specify function names and values should be functions.
* __string_variables__ (*dict*) Mapping between variable name and initial variable value for string variables.

##### variables
Returns dictionary like object containing variable values. `Symbol_Table` values can be updated through this object.

__Example:__

```python
	>>> import cexprtk
	>>> st = cexprtk.Symbol_Table({'x' : 5, 'y' : 5})
	>>> expression = cexprtk.Expression('x+y', st)
	>>> expression()
	10.0
```

Update the value of `x` in the symbol table and re-evaluate the expression:

```python
	>>> expression.symbol_table.variables['x'] = 11.0
	>>> expression()
	16.0
```

__Returns:__

* Dictionary like giving variables stored in this `Symbol_Table`. Keys are variables names and these map to variable values.

##### constants
Property giving constants stored in this `Symbol_Table`.

__Returns:__

* Read-only dictionary like object mapping constant names stored in `Symbol_Table` to their values.

##### functions
Returns dictionary like object containing custom python functions to use in expressions. 

__Returns:__

* Dictionary like giving function stored in this `Symbol_Table`. Keys are function names (as used in `Expression`) and these map to python callable objects including functions, functors, and `functools.partial`.

##### string_variables
Returns dictionary like object containing string variable values. `Symbol_Table` values can be updated through this object.

__Example:__

```python
	>>> import cexprtk
	>>> st = cexprtk.Symbol_Table({})
	>>> st.string_variables['s1'] = 'he'
	>>> st.string_variables['s2'] = 'l'
	>>> st.string_variables['s3'] = 'lo'
	>>> expression = cexprtk.Expression("return[s1+s2+s3+' world']", st)
	>>> expression.value()
	nan
	>>> expression.results()
	['hello world']
```

__Returns:__

* Dictionary like giving the string variables stored in this `Symbol_Table`. Keys are variables names and these map to string values.


---

#### class USRSymbolType:
Defines constant values used to determine symbol type returned by `unknown_symbol_resolver_callback` (see `Expression` constructor documentation for more).

##### VARIABLE
Value that should be returned by an `unknown_symbol_resolver_callback` to define a variable.

##### CONSTANT
Value that should be returned by an `unknown_symbol_resolver_callback` to define a constant.

---

### Utility Functions
#### def check_expression (*expression*)

Check that expression can be parsed. If successful do nothing, if unsuccessful raise `ParseException`.

__Parameters:__

* *expression* (*str*) Formula to be evaluated

__Raises:__ 

* `ParseException`: If expression is invalid.	


#### def evaluate_expression (*expression*, *variables*)
Evaluate a mathematical formula using the exprtk library and return result.

For more information about supported functions and syntax see the
[exprtk C++ library website](http://www.partow.net/programming/exprtk/index.html).

__Parameters:__

* __expression__ (*str*) Expression to be evaluated.
* __variables__ (*dict*) Dictionary containing variable name, variable value pairs to be used in expression.

__Returns:__ 

* (*float*): Evaluated expression

__Raises:__ 

* `ParseException`: if *expression* is invalid.

---

## Authors

Cython wrapper by Michael Rushton (m.j.d.rushton@gmail.com), although most credit should go to Arash Partow for creating the underlying [ExprTK][ExprTK] library.

Thanks to:

* [jciskey][jciskey] for adding the `Expression.results()` support.
* [Caleb Hattingh][cjrh] for getting cexprtk to build using MSVC on Windows.


## License

`cexprtk` is released under the same terms as the [ExprTK][ExprTK] library the [Common Public License Version 1.0][] (CPL).

[pip]: http://www.pip-installer.org/en/latest/index.html
[Common Public License Version 1.0]: http://opensource.org/licenses/cpl1.0.php
[ExprTK]: http://www.partow.net/programming/exprtk/index.html
[jciskey]: https://github.com/jciskey
[cjrh]: https://github.com/cjrh

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/mjdrushton/cexprtk",
    "name": "cexprtk",
    "maintainer": "",
    "docs_url": null,
    "requires_python": "",
    "maintainer_email": "",
    "keywords": "math,formula,parser,arithmetic,evaluate",
    "author": "M.J.D. Rushton",
    "author_email": "m.j.d.rushton@gmail.com",
    "download_url": "https://files.pythonhosted.org/packages/8e/59/9cf2113ce3a7064473475ad5ab811ae5dc7a15f159e54bc2b2b17598b74d/cexprtk-0.4.1.tar.gz",
    "platform": null,
    "description": "# cexprtk: Mathematical Expression Parsing and Evaluation in Python\n\n`cexprtk` is a cython wrapper around the \"[ExprTK: C++ Mathematical Expression  Toolkit Library ][ExprTK]\"  by Arash Partow. Using `cexprtk` a powerful mathematical expression engine can be incorporated into your python project.\n\n## Table of Contents\n\n- [Installation](#installation)\n- [Usage](#usage)\n  - [Example: Evaluate a simple equation](#example-evaluate-a-simple-equation)\n  - [Example: Using Variables](#example-using-variables)\n  - [Example: Re-using expressions](#example-re-using-expressions)\n  - [Example: Defining custom functions](#example-defining-custom-functions)\n  - [Example: Defining an unknown symbol resolver](#example-defining-an-unknown-symbol-resolver)\n  - [Example: expressions that contain return statements to produce multiple values](#example-expressions-that-contain-return-statements-to-produce-multiple-values)\n- [API Reference](#api-reference)\n  - [Class Reference](#class-reference)\n    - [class Expression:](#class-expression)\n      - [Defining unknown symbol-resolver:](#defining-unknown-symbol-resolver)\n      - [def __init__(self, *expression*, *symbol_table*, *unknown_symbol_resolver_callback* = None):](#def-__init__self-expression-symbol_table-unknown_symbol_resolver_callback--none)\n      - [def results(self):](#def-resultsself)\n      - [def value(self):](#def-valueself)\n      - [def __call__(self):](#def-__call__self)\n      - [symbol_table](#symbol_table)\n    - [class Symbol_Table:](#class-symbol_table)\n      - [def __init__(self, *variables*, *constants* = {}, *add_constants* = False, functions = {}):](#def-__init__self-variables-constants---add_constants--false-functions--)\n      - [variables](#variables)\n      - [constants](#constants)\n      - [functions](#functions)\n    - [class USRSymbolType:](#class-usrsymboltype)\n      - [VARIABLE](#variable)\n      - [CONSTANT](#constant)\n  - [Utility Functions](#utility-functions)\n    - [def check_expression (*expression*)](#def-check_expression-expression)\n    - [def evaluate_expression (*expression*, *variables*)](#def-evaluate_expression-expression-variables)\n- [Authors](#authors)\n- [License](#license)\n\n## Installation\n\nThe latest version of `cexprtk` can be installed using [pip][pip] :\n\n```bash\n\t$ pip install cexprtk\n```\n\n__Note:__ Installation requires a compatible C++ compiler to be installed (unless installing from a binary wheel).\n\n\n## Usage\n\nThe following examples show the major features of `cexprtk`. \n\n### Example: Evaluate a simple equation\n\nThe following shows how the arithmetic expression `(5+5) * 23` can be evaluated:\n\n```python\n\t>>> import cexprtk\n\t>>> cexprtk.evaluate_expression(\"(5+5) * 23\", {})\n\t230.0\n```\n\n### Example: Using Variables\n\nVariables can be used within expressions by passing a dictionary to the `evaluate_expression` function. This maps variable names to their values. The expression from the previous example can be re-calculated using variable values:\n\n```python\n\t>>> import cexprtk\n\t>>> cexprtk.evaluate_expression(\"(A+B) * C\", {\"A\" : 5, \"B\" : 5, \"C\" : 23})\n\t230.0\n```\n\n### Example: Re-using expressions\nWhen using the `evaluate_expression()` function, the mathematical expression is parsed, evaluated and then immediately thrown away. This example shows how to re-use an `Expression` for multiple evaluations.\n\n* An expression will be defined to calculate the circumference of circle, this will then be re-used to calculate the value for several different radii.\n* First a `Symbol_Table` is created containing a variable `r` (for radius), it is also populated with some useful constants such as \u03c0.\n\n```python\n\t>>> import cexprtk\n\t>>> st = cexprtk.Symbol_Table({'r' : 1.0}, add_constants= True)\n```\n\n* Now an instance of `Expression` is created, defining our function:\n\n```python\n\t>>> circumference = cexprtk.Expression('2*pi*r', st)\n```\n\n* The `Symbol_Table` was initialised with `r=1`, the expression can be evaluated for this radius simply by calling it:\n\n```python\n\t>>> circumference()\n\t6.283185307179586\n```\n\n* Now update the radius to a value of 3.0 using the dictionary like object returned by the `Symbol_Table`'s `.variables` property:\n\n```python\n\t>>> st.variables['r'] = 3.0\n\t>>> circumference()\n\t18.84955592153876\n```\n\n### Example: Defining custom functions\nPython functions can be registered with a `Symbol_Table` then used in an `Expression`. In this example a custom function will be defined which produces a random number within a given range.\n\nA suitable function exists in the `random` module, namely `random.uniform`. As this is an instance method it needs to be wrapped in function:\n\n```python\n>>> import random\n>>> def rnd(low, high):\n...   return random.uniform(low,high)\n...\n```\n\nOur `rnd` function now needs to be registered with a `Symbol_Table`:\n\n```python\n>>> import cexprtk\n>>> st = cexprtk.Symbol_Table({})\n>>> st.functions[\"rand\"] = rnd\n```\n\nThe `functions` property of the `Symbol_Table` is accessed like a dictionary. In the preceding code snippet, a symbol table is created and then the `rnd` function is assigned to the `rand` key. This key is used as the function's name in a `cexprtk` expression. The key cannot be the same as an existing variable, constant or reserved function name.\n\nThe `rand` function will now be used in an expression. This expression chooses a random number between 5 and 8 and then multiplies it by 10. The followin snippet shows the instantiation of the `Expression` which is then evaluated a few times. You will probably get different numbers out of your expression than shown, this is because your random number generator will have been initialised with a different seed than used in the example.\n\n```python\n>>> e = cexprtk.Expression(\"rand(5,8) * 10\", st)\n>>> e()\n61.4668441077191\n>>> e()\n77.13523163246415\n>>> e()\n59.14881842716157\n>>> e()\n69.1476535568958\n```\n\n### Example: Defining an unknown symbol resolver\nA callback can be passed to the `Expression` constructor through the `unknown_symbol_resolver_callback` parameter. This callback is invoked during expression parsing when a variable or constant is encountered that isn't in the `Symbol_Table` associated with the `Expression`. \n\nThe callback can be used to provide some logic that leads to a new symbol being registered or for an error condition to be flagged.\n\n__The Problem:__ The following example shows a potential use for the symbol resolver:\n\n* An expression contains variables of the form `m_VARIABLENAME` and `f_VARIABLENAME`.\n* `m_` or `f_` prefix the  actual variable name (perhaps indicating gender).\n* `VARIABLENAME` should be used to look up the desired value in a dictionary.\n* The dictionary value of `VARIABLENAME` should then be weighted according to its prefix:\n\t+ `m_` variables should be multiplied by 0.8.\n\t+ `f_` variables should be multiplied by 1.1.\n\n__The Solution:__\n\n* First the `VARIABLENAME` dictionary is defined:\n\t\n\t```python\n\tvariable_values = { 'county_a' : 82, 'county_b' : 76}\n\t```\n\n* Now the callback is defined. This takes a single argument, *symbol*, which gives the name of the missing variable found in the expression:\n\n\t```python\n\tdef callback(symbol):\n\t\t# Tokenize the symbol name into prefix and VARIABLENAME components.\n\t\tprefix,variablename = symbol.split(\"_\", 1)\n\t\t# Get the value for this VARIABLENAME from the variable_values dict\n\t\tvalue = variable_values[variablename]\n\t\t# Find the correct weight for the prefix\n\t\tif prefix == 'm':\n\t\t\tweight = 0.8\n\t\telif prefix == 'f':\n\t\t\tweight = 1.1\n\t\telse:\n\t\t\t# Flag an error condition if prefix not found.\n\t\t\terrormsg = \"Unknown prefix \"+ str(prefix)\n\t\t\treturn (False, cexprtk.USRSymbolType.VARIABLE, 0.0, errormsg)\n\t\t# Apply the weight to the \n\t\tvalue *= weight\n\t\t# Indicate success and return value to cexprtk\n\t\treturn (True, cexprtk.USRSymbolType.VARIABLE, value, \"\")\n\t```\n\n* All that remains is to register the callback with an instance of `Expression` and to evaluate an expression. The expression to be evaluated is:\n\t- `(m_county_a - f_county_b)`\n\t- This should give a value of `(0.8*82) - (1.1*76) = -18`\n\n\t```python\n\t\t>>> st = cexprtk.Symbol_Table({})\n\t\t>>> e = cexprtk.Expression(\"(m_county_a - f_county_b)\", st, callback)\n\t\t>>> e.value()\n\t\t-18.0\n\t```\n\n### Example: expressions that contain return statements to produce multiple values\n\nExprtk expressions can return multiple values the results these expressions can be accessed through the `results()` method.\n\nThe following example shows the result of adding a constant value to a vector containing numbers:\n\n```python\n\t>>> st = cexprtk.Symbol_Table({})\n\t>>> e = cexprtk.Expression(\"var v[3] := {1,2,3}; return [v+1];\", st)\n\t>>> e.value()\n\tnan\n\t>>> e.results()\n\t[[2.0, 3.0, 4.0]]\n```\nNote that expression has to be evaluated before calling the `results()` method.\n\nThe value accessed through `results()` can contain a mixture of strings, vectors and real values:\n\n```python\n\t>>> st = cexprtk.Symbol_Table({'c' : 3})\n\t>>> e = cexprtk.Expression(\"if(c>1){return ['bigger than one', c];} else { return ['not bigger than one',c];};\",st)\n\t>>> e.value()\n\tnan\n\t>>> e.results()\n\t['bigger than one', 3.0]\n\t>>> st.variables['c']=0.5\n\t>>> e.value()\n\tnan\n\t>>> e.results()\n\t['not bigger than one', 0.5]\n```\n\n---\n\n## API Reference\n\nFor information about expressions supported by `cexprtk` please refer to the original C++ [ExprTK][] documentation:\n\n### Class Reference\n\n#### class Expression:\nClass representing mathematical expression.\n\n* Following instantiation, the expression is evaluated calling the expression or invoking its `value()` method.\n* The variable values used by the Expression can be modified through the `variables` property of the `Symbol_Table` instance associated with the expression. The `Symbol_Table` can be accessed using the `Expression.symbol_table` property.\n\n##### Defining unknown symbol-resolver:\n\nThe `unknown_symbol_resolver_callback` argument  to the `Expression`\nconstructor accepts a callable which is invoked  whenever a symbol (i.e. a\nvariable or a constant), is not found in the `Symbol_Table` given by the\n`symbol_table` argument. The `unknown_symbol_resolver_callback` can be\nused to provide a value for the missing value or to set an error condition.\n\nThe callable should have following signature:\n\n```python\n\tdef callback(symbol_name):\n\t\t...\n```\n\nWhere `symbol_name` is a string identifying the missing symbol.\n\nThe callable should return a tuple of the form:\n\n```python\n\t(HANDLED_FLAG, USR_SYMBOL_TYPE, SYMBOL_VALUE, ERROR_STRING)\n```\n\nWhere:\n\n* `HANDLED_FLAG` is a boolean:\n\t+ `True` indicates that callback was able handle the error condition and that `SYMBOL_VALUE` should be used for the missing symbol. \n\t+ `False`, flags and error condition, the reason why the unknown symbol could not be resolved by the callback is described by `ERROR_STRING`.\n* `USR_SYMBOL_TYPE` gives type of symbol (constant or variable) that should be added to the `symbol_table` when unkown symbol is resolved. Value should be one of those given in `cexprtk.USRSymbolType`. e.g.\n\t+ `cexprtk.USRSymbolType.VARIABLE`  \n\t+ `cexprtk.USRSymbolType.CONSTANT`  \n* `SYMBOL_VALUE`, floating point value that should be used when resolving missing symbol.\n* `ERROR_STRING` when `HANDLED_FLAG` is `False` this can be used to describe error condition.\n\n##### def __init__(self, *expression*, *symbol_table*, *unknown_symbol_resolver_callback* = None):\nInstantiate `Expression` from a text string giving formula and `Symbol_Table`\ninstance encapsulating variables and constants used by the expression.\n\n__Parameters:__\n\n* __expression__ (*str*) String giving expression to be calculated.\n* __symbol_table__ (*Symbol_Table*) Object defining variables and constants.\n* __unknown_symbol_resolver_callback__ (*callable*)  See description above.\n\n##### def results(self):\nIf an expression contains a `return []` statement, the returned values are accessed using this method. \n\nA python list is returned which may contain real values, strings or vectors.\n\n**Note:** the expression should be evaluated by calling `value()` before trying to access results.\n\n__Returns:__\n\n* (*list*) List of values produced by expression's `return` statement.\n\n##### def value(self):\nEvaluate expression using variable values currently set within associated `Symbol_Table`\n\n__Returns:__\n\n* (*float*) Value resulting from evaluation of expression.\n\n##### def __call__(self):\nEquivalent to calling `value()` method.\n\n__Returns:__\n\n* (*float*) Value resulting from evaluation of expression.\n\n##### symbol_table\nRead only property that returns `Symbol_Table` instance associated with this expression.\n\n__Returns:__\n\n* (*Symbol_Table*) `Symbol_Table` associated with this `Expression`.\n\n---\n\n#### class Symbol_Table:\nClass for providing variable and constant values to `Expression` instances.\n\n\n##### def __init__(self, *variables*, *constants* = {}, *add_constants* = False, functions = {}, *string_variables* = {}):\nInstantiate `Symbol_Table` defining variables and constants for use with `Expression` class.\n\n__Example:__\n\n* To instantiate a `Symbol_Table` with:\n\t+ `x = 1`\n\t+ `y = 5`\n\t+ define a constant `k = 1.3806488e-23`\n* The following code would be used:\n\n\t```python\n\t\tst = cexprtk.Symbol_Table({'x' : 1, 'y' : 5}, {'k'= 1.3806488e-23})\n\t```\n\n__Parameters:__\n\n* __variables__ (*dict*) Mapping between variable name and initial variable value.\n* __constants__ (*dict*) Dictionary containing values that should be added to `Symbol_Table` as constants. These can be used a variables within expressions but their values cannot be updated following `Symbol_Table` instantiation.\n* __add_constants__ (*bool*) If `True`, add the standard constants `pi`, `inf`, `epsilon` to the 'constants' dictionary before populating the `Symbol_Table`\n* __functions__ (*dict*) Dictionary containing custom functions to be made available to expressions. Dictionary keys specify function names and values should be functions.\n* __string_variables__ (*dict*) Mapping between variable name and initial variable value for string variables.\n\n##### variables\nReturns dictionary like object containing variable values. `Symbol_Table` values can be updated through this object.\n\n__Example:__\n\n```python\n\t>>> import cexprtk\n\t>>> st = cexprtk.Symbol_Table({'x' : 5, 'y' : 5})\n\t>>> expression = cexprtk.Expression('x+y', st)\n\t>>> expression()\n\t10.0\n```\n\nUpdate the value of `x` in the symbol table and re-evaluate the expression:\n\n```python\n\t>>> expression.symbol_table.variables['x'] = 11.0\n\t>>> expression()\n\t16.0\n```\n\n__Returns:__\n\n* Dictionary like giving variables stored in this `Symbol_Table`. Keys are variables names and these map to variable values.\n\n##### constants\nProperty giving constants stored in this `Symbol_Table`.\n\n__Returns:__\n\n* Read-only dictionary like object mapping constant names stored in `Symbol_Table` to their values.\n\n##### functions\nReturns dictionary like object containing custom python functions to use in expressions. \n\n__Returns:__\n\n* Dictionary like giving function stored in this `Symbol_Table`. Keys are function names (as used in `Expression`) and these map to python callable objects including functions, functors, and `functools.partial`.\n\n##### string_variables\nReturns dictionary like object containing string variable values. `Symbol_Table` values can be updated through this object.\n\n__Example:__\n\n```python\n\t>>> import cexprtk\n\t>>> st = cexprtk.Symbol_Table({})\n\t>>> st.string_variables['s1'] = 'he'\n\t>>> st.string_variables['s2'] = 'l'\n\t>>> st.string_variables['s3'] = 'lo'\n\t>>> expression = cexprtk.Expression(\"return[s1+s2+s3+' world']\", st)\n\t>>> expression.value()\n\tnan\n\t>>> expression.results()\n\t['hello world']\n```\n\n__Returns:__\n\n* Dictionary like giving the string variables stored in this `Symbol_Table`. Keys are variables names and these map to string values.\n\n\n---\n\n#### class USRSymbolType:\nDefines constant values used to determine symbol type returned by `unknown_symbol_resolver_callback` (see `Expression` constructor documentation for more).\n\n##### VARIABLE\nValue that should be returned by an `unknown_symbol_resolver_callback` to define a variable.\n\n##### CONSTANT\nValue that should be returned by an `unknown_symbol_resolver_callback` to define a constant.\n\n---\n\n### Utility Functions\n#### def check_expression (*expression*)\n\nCheck that expression can be parsed. If successful do nothing, if unsuccessful raise `ParseException`.\n\n__Parameters:__\n\n* *expression* (*str*) Formula to be evaluated\n\n__Raises:__ \n\n* `ParseException`: If expression is invalid.\t\n\n\n#### def evaluate_expression (*expression*, *variables*)\nEvaluate a mathematical formula using the exprtk library and return result.\n\nFor more information about supported functions and syntax see the\n[exprtk C++ library website](http://www.partow.net/programming/exprtk/index.html).\n\n__Parameters:__\n\n* __expression__ (*str*) Expression to be evaluated.\n* __variables__ (*dict*) Dictionary containing variable name, variable value pairs to be used in expression.\n\n__Returns:__ \n\n* (*float*): Evaluated expression\n\n__Raises:__ \n\n* `ParseException`: if *expression* is invalid.\n\n---\n\n## Authors\n\nCython wrapper by Michael Rushton (m.j.d.rushton@gmail.com), although most credit should go to Arash Partow for creating the underlying [ExprTK][ExprTK] library.\n\nThanks to:\n\n* [jciskey][jciskey] for adding the `Expression.results()` support.\n* [Caleb Hattingh][cjrh] for getting cexprtk to build using MSVC on Windows.\n\n\n## License\n\n`cexprtk` is released under the same terms as the [ExprTK][ExprTK] library the [Common Public License Version 1.0][] (CPL).\n\n[pip]: http://www.pip-installer.org/en/latest/index.html\n[Common Public License Version 1.0]: http://opensource.org/licenses/cpl1.0.php\n[ExprTK]: http://www.partow.net/programming/exprtk/index.html\n[jciskey]: https://github.com/jciskey\n[cjrh]: https://github.com/cjrh\n",
    "bugtrack_url": null,
    "license": "CPL",
    "summary": "Mathematical expression parser: cython wrapper around the 'C++ Mathematical Expression Toolkit Library'",
    "version": "0.4.1",
    "split_keywords": [
        "math",
        "formula",
        "parser",
        "arithmetic",
        "evaluate"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "ed0102c165677eba310a8ae9428fa67c47a130c7d4fe28310efa0bb5b2427b58",
                "md5": "8ebda60947be9088759b45fd78ccafa9",
                "sha256": "30098864b97906a3bafa8f32bb64534b449d673f39a87296df2e383d3b6b13c1"
            },
            "downloads": -1,
            "filename": "cexprtk-0.4.1-cp310-cp310-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "8ebda60947be9088759b45fd78ccafa9",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": null,
            "size": 2236834,
            "upload_time": "2023-04-12T22:13:14",
            "upload_time_iso_8601": "2023-04-12T22:13:14.782056Z",
            "url": "https://files.pythonhosted.org/packages/ed/01/02c165677eba310a8ae9428fa67c47a130c7d4fe28310efa0bb5b2427b58/cexprtk-0.4.1-cp310-cp310-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "f2d1e9d14f6bf96f36d18d01560040cda54a14dc34ec29d132b573c3f4370080",
                "md5": "6faf148141bd349360decd8e3e20992e",
                "sha256": "80ea10d58966e560f86f651d86c166560125eaebf5b4bec0d60660001afa0ab9"
            },
            "downloads": -1,
            "filename": "cexprtk-0.4.1-cp310-cp310-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "6faf148141bd349360decd8e3e20992e",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": null,
            "size": 2067056,
            "upload_time": "2023-04-12T22:13:19",
            "upload_time_iso_8601": "2023-04-12T22:13:19.529892Z",
            "url": "https://files.pythonhosted.org/packages/f2/d1/e9d14f6bf96f36d18d01560040cda54a14dc34ec29d132b573c3f4370080/cexprtk-0.4.1-cp310-cp310-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "fb53bdf43bb5e7ae92a66564467f83ee5b118559f254b947a97bfafd97ea322d",
                "md5": "4733a424e63a4d452faebcffe2851146",
                "sha256": "6e45a2e25576e496b55f717cd89a355a619e88d6c165ae907ed9d6edf33ff070"
            },
            "downloads": -1,
            "filename": "cexprtk-0.4.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl",
            "has_sig": false,
            "md5_digest": "4733a424e63a4d452faebcffe2851146",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": null,
            "size": 22425698,
            "upload_time": "2023-04-12T22:13:42",
            "upload_time_iso_8601": "2023-04-12T22:13:42.305809Z",
            "url": "https://files.pythonhosted.org/packages/fb/53/bdf43bb5e7ae92a66564467f83ee5b118559f254b947a97bfafd97ea322d/cexprtk-0.4.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "4f1917d5f6baec9d700fad6fbfd94d78c9e1ac217c1e7a5fd64c242d0edbfec8",
                "md5": "69fd0763628cc5aec36cb55af4ab28ce",
                "sha256": "e383897a9a201e1c6af0e5355c8ededffdb4e574f33917ff4690e3f0f1e59f01"
            },
            "downloads": -1,
            "filename": "cexprtk-0.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "69fd0763628cc5aec36cb55af4ab28ce",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": null,
            "size": 22974007,
            "upload_time": "2023-04-12T22:14:14",
            "upload_time_iso_8601": "2023-04-12T22:14:14.828087Z",
            "url": "https://files.pythonhosted.org/packages/4f/19/17d5f6baec9d700fad6fbfd94d78c9e1ac217c1e7a5fd64c242d0edbfec8/cexprtk-0.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "4d20b52e8c7f314dd6f6221993101c798e4844700edbab067da3fd2d9cb78288",
                "md5": "1320a0ac297f5699fd85a466ec2ada15",
                "sha256": "29e06633a0a96572eb3289a4d3497f710b49ec4dd659464c737ad59024ed4d92"
            },
            "downloads": -1,
            "filename": "cexprtk-0.4.1-cp310-cp310-musllinux_1_1_i686.whl",
            "has_sig": false,
            "md5_digest": "1320a0ac297f5699fd85a466ec2ada15",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": null,
            "size": 23040348,
            "upload_time": "2023-04-12T22:14:39",
            "upload_time_iso_8601": "2023-04-12T22:14:39.662126Z",
            "url": "https://files.pythonhosted.org/packages/4d/20/b52e8c7f314dd6f6221993101c798e4844700edbab067da3fd2d9cb78288/cexprtk-0.4.1-cp310-cp310-musllinux_1_1_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "9ec0a98bca0900125df2a551a916270232f9ad2124e95e9c4b78a1a9651f58f4",
                "md5": "f9a6772532f948357b024f6b33185960",
                "sha256": "679a28b3382ac5dff9b8f17aca83dea2f16de8e6847db6462237ed7167c51b30"
            },
            "downloads": -1,
            "filename": "cexprtk-0.4.1-cp310-cp310-musllinux_1_1_x86_64.whl",
            "has_sig": false,
            "md5_digest": "f9a6772532f948357b024f6b33185960",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": null,
            "size": 22697157,
            "upload_time": "2023-04-12T22:15:09",
            "upload_time_iso_8601": "2023-04-12T22:15:09.227880Z",
            "url": "https://files.pythonhosted.org/packages/9e/c0/a98bca0900125df2a551a916270232f9ad2124e95e9c4b78a1a9651f58f4/cexprtk-0.4.1-cp310-cp310-musllinux_1_1_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "de8d7a37642f1f44ffd5e6e42936aa9ec2fc41ce1f66b40438394d646af0f77f",
                "md5": "cab6b60bec8e579429dba7d99511bd19",
                "sha256": "c60a28f00b84a8071ab66ffc686605e17f3042b363b594fd9d844d2e7e6042d0"
            },
            "downloads": -1,
            "filename": "cexprtk-0.4.1-cp310-cp310-win32.whl",
            "has_sig": false,
            "md5_digest": "cab6b60bec8e579429dba7d99511bd19",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": null,
            "size": 779017,
            "upload_time": "2023-04-12T22:15:13",
            "upload_time_iso_8601": "2023-04-12T22:15:13.281027Z",
            "url": "https://files.pythonhosted.org/packages/de/8d/7a37642f1f44ffd5e6e42936aa9ec2fc41ce1f66b40438394d646af0f77f/cexprtk-0.4.1-cp310-cp310-win32.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "79abc1ee71db3cdcd980cd327caa80b8de97d5197f967d76855edb5733dd0e76",
                "md5": "99b48618e818fc2b35c8d2f6156b340a",
                "sha256": "ddae8dcca28dad136be958a533eb8248f92d5adabf604b6b20eaed1312880afa"
            },
            "downloads": -1,
            "filename": "cexprtk-0.4.1-cp310-cp310-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "99b48618e818fc2b35c8d2f6156b340a",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": null,
            "size": 847451,
            "upload_time": "2023-04-12T22:15:16",
            "upload_time_iso_8601": "2023-04-12T22:15:16.595079Z",
            "url": "https://files.pythonhosted.org/packages/79/ab/c1ee71db3cdcd980cd327caa80b8de97d5197f967d76855edb5733dd0e76/cexprtk-0.4.1-cp310-cp310-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "0b8caa2db10f231efe8dc7be38a69793f5da548db49da21870fe91f4e67e2a57",
                "md5": "9ff9a53a57bc5a6caeb9404e51b7803b",
                "sha256": "5a54f7dfa0ba59f3aa6385342b751c347585bd737e700e460b6df2fd4082b98e"
            },
            "downloads": -1,
            "filename": "cexprtk-0.4.1-cp311-cp311-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "9ff9a53a57bc5a6caeb9404e51b7803b",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": null,
            "size": 2225237,
            "upload_time": "2023-04-12T22:15:21",
            "upload_time_iso_8601": "2023-04-12T22:15:21.050038Z",
            "url": "https://files.pythonhosted.org/packages/0b/8c/aa2db10f231efe8dc7be38a69793f5da548db49da21870fe91f4e67e2a57/cexprtk-0.4.1-cp311-cp311-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "badd7e48001864a3a68181a1e4102069b1df841d7394833996907987d6c88c7c",
                "md5": "ad71423eeabac1e21460920915d3c9bc",
                "sha256": "0d88a814742eea6f1becdd72b1fed8d8aabab20a5a58172515f73c22d1c014f1"
            },
            "downloads": -1,
            "filename": "cexprtk-0.4.1-cp311-cp311-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "ad71423eeabac1e21460920915d3c9bc",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": null,
            "size": 2056521,
            "upload_time": "2023-04-12T22:15:25",
            "upload_time_iso_8601": "2023-04-12T22:15:25.526975Z",
            "url": "https://files.pythonhosted.org/packages/ba/dd/7e48001864a3a68181a1e4102069b1df841d7394833996907987d6c88c7c/cexprtk-0.4.1-cp311-cp311-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "2b6aa1815d67a625f63bf41354b360416a7ad6cff50c834a2d99164ffe488734",
                "md5": "1565cd19923db70b61bdab13a8868ed5",
                "sha256": "989279d15176885de35617195f699d894decfadf26621f5c3cec12684181ce76"
            },
            "downloads": -1,
            "filename": "cexprtk-0.4.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl",
            "has_sig": false,
            "md5_digest": "1565cd19923db70b61bdab13a8868ed5",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": null,
            "size": 22429326,
            "upload_time": "2023-04-12T22:15:50",
            "upload_time_iso_8601": "2023-04-12T22:15:50.295781Z",
            "url": "https://files.pythonhosted.org/packages/2b/6a/a1815d67a625f63bf41354b360416a7ad6cff50c834a2d99164ffe488734/cexprtk-0.4.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "bbf050fd7e90aa7c09a586adfd1d1c20bcd8f4e51938013a9c65126b263a2011",
                "md5": "e648ebfee1c877def437f3ec403de0e8",
                "sha256": "aafa65856f98d07ad1e92a12f325de383426233b53d05dbe58f4d3eb2108e6a8"
            },
            "downloads": -1,
            "filename": "cexprtk-0.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "e648ebfee1c877def437f3ec403de0e8",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": null,
            "size": 22992624,
            "upload_time": "2023-04-12T22:16:13",
            "upload_time_iso_8601": "2023-04-12T22:16:13.634853Z",
            "url": "https://files.pythonhosted.org/packages/bb/f0/50fd7e90aa7c09a586adfd1d1c20bcd8f4e51938013a9c65126b263a2011/cexprtk-0.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "c1b9cdae48005cecb20da9576dc612ea9c0d19d0e38609e4e2a367bebaad0e0d",
                "md5": "8f55b68f8ee5f5de0f3b2f9881cd9725",
                "sha256": "093d4439c6d7e80978e4c521a3875e77c1ba6d15fb589f05f62b306e280c3878"
            },
            "downloads": -1,
            "filename": "cexprtk-0.4.1-cp311-cp311-musllinux_1_1_i686.whl",
            "has_sig": false,
            "md5_digest": "8f55b68f8ee5f5de0f3b2f9881cd9725",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": null,
            "size": 23048161,
            "upload_time": "2023-04-12T22:16:37",
            "upload_time_iso_8601": "2023-04-12T22:16:37.613762Z",
            "url": "https://files.pythonhosted.org/packages/c1/b9/cdae48005cecb20da9576dc612ea9c0d19d0e38609e4e2a367bebaad0e0d/cexprtk-0.4.1-cp311-cp311-musllinux_1_1_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "a26d2106430da60d66177f33abba48b85c296591a021e996dcb32a24d76f7e0a",
                "md5": "e7863b33258bb9c624dbfad2233892c1",
                "sha256": "1b6178ad78f8f5663fe7178742e396fabf1ee24233eb111569de9c78ae9c7303"
            },
            "downloads": -1,
            "filename": "cexprtk-0.4.1-cp311-cp311-musllinux_1_1_x86_64.whl",
            "has_sig": false,
            "md5_digest": "e7863b33258bb9c624dbfad2233892c1",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": null,
            "size": 22716246,
            "upload_time": "2023-04-12T22:17:01",
            "upload_time_iso_8601": "2023-04-12T22:17:01.649197Z",
            "url": "https://files.pythonhosted.org/packages/a2/6d/2106430da60d66177f33abba48b85c296591a021e996dcb32a24d76f7e0a/cexprtk-0.4.1-cp311-cp311-musllinux_1_1_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "1d88138c24491252a1350be165f1c9cff47af930eafe89cac48adc63cadd7c38",
                "md5": "3d407652cc21f0e660999c6cd053685c",
                "sha256": "6b2380e94b1bb3ddb97711c2fa06d9d0b7d75247922d6fd711daa6b1aae83d24"
            },
            "downloads": -1,
            "filename": "cexprtk-0.4.1-cp311-cp311-win32.whl",
            "has_sig": false,
            "md5_digest": "3d407652cc21f0e660999c6cd053685c",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": null,
            "size": 777114,
            "upload_time": "2023-04-12T22:17:05",
            "upload_time_iso_8601": "2023-04-12T22:17:05.006621Z",
            "url": "https://files.pythonhosted.org/packages/1d/88/138c24491252a1350be165f1c9cff47af930eafe89cac48adc63cadd7c38/cexprtk-0.4.1-cp311-cp311-win32.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "dde28ef17df383ccecd86cba55b439b51ecc3a29b052185319a5b451d9df990e",
                "md5": "f9f5c321a89afa5fe042787833c38f90",
                "sha256": "854ea1146b8ed56db89cd340c8df14eee9fc3b93e620e4aa019c55d0b6530921"
            },
            "downloads": -1,
            "filename": "cexprtk-0.4.1-cp311-cp311-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "f9f5c321a89afa5fe042787833c38f90",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": null,
            "size": 843153,
            "upload_time": "2023-04-12T22:17:08",
            "upload_time_iso_8601": "2023-04-12T22:17:08.255763Z",
            "url": "https://files.pythonhosted.org/packages/dd/e2/8ef17df383ccecd86cba55b439b51ecc3a29b052185319a5b451d9df990e/cexprtk-0.4.1-cp311-cp311-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "fe861c68c08ae47d7fc22bf5a09b8e3ddc0794310dde024b3eb9494ab108da2f",
                "md5": "c6707abd4f9564e619fbfbcc474e7464",
                "sha256": "5dc23b11c90447b630520ea2d1ea882e79d3699cfe7048820e8614684b2eafc1"
            },
            "downloads": -1,
            "filename": "cexprtk-0.4.1-cp36-cp36m-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "c6707abd4f9564e619fbfbcc474e7464",
            "packagetype": "bdist_wheel",
            "python_version": "cp36",
            "requires_python": null,
            "size": 2257305,
            "upload_time": "2023-04-12T22:17:13",
            "upload_time_iso_8601": "2023-04-12T22:17:13.134578Z",
            "url": "https://files.pythonhosted.org/packages/fe/86/1c68c08ae47d7fc22bf5a09b8e3ddc0794310dde024b3eb9494ab108da2f/cexprtk-0.4.1-cp36-cp36m-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "f6adbeb711c1f57dd14a80dde4512ca1c55b83331f00cf98345b0d3d5f9ac28d",
                "md5": "afdb0cc7c81b6c50c76e6df9efe41b47",
                "sha256": "c0f65ab07f7c0b834fb7884227424e20c82989df4bda90f3aff002e538c6f1cc"
            },
            "downloads": -1,
            "filename": "cexprtk-0.4.1-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl",
            "has_sig": false,
            "md5_digest": "afdb0cc7c81b6c50c76e6df9efe41b47",
            "packagetype": "bdist_wheel",
            "python_version": "cp36",
            "requires_python": null,
            "size": 22372608,
            "upload_time": "2023-04-12T22:17:39",
            "upload_time_iso_8601": "2023-04-12T22:17:39.164261Z",
            "url": "https://files.pythonhosted.org/packages/f6/ad/beb711c1f57dd14a80dde4512ca1c55b83331f00cf98345b0d3d5f9ac28d/cexprtk-0.4.1-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "dc8099edab48193889ff97bad263c448263a99820ceff6049393173ddaeddfd8",
                "md5": "a975c78d908de5356dbbe6453e6a0f11",
                "sha256": "85167566601e269a8e709b85e43ce185dcd5c939827303890c1190fbffe23695"
            },
            "downloads": -1,
            "filename": "cexprtk-0.4.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "a975c78d908de5356dbbe6453e6a0f11",
            "packagetype": "bdist_wheel",
            "python_version": "cp36",
            "requires_python": null,
            "size": 22939570,
            "upload_time": "2023-04-12T22:18:03",
            "upload_time_iso_8601": "2023-04-12T22:18:03.736330Z",
            "url": "https://files.pythonhosted.org/packages/dc/80/99edab48193889ff97bad263c448263a99820ceff6049393173ddaeddfd8/cexprtk-0.4.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "47ad9f34bb29a2db219bdb1884fb7637a1d050f6da0760c692323ce2dc519afc",
                "md5": "134d8591b1821ee1378a1d157c9add1c",
                "sha256": "9bcf23417968ba2a5af8c38a0e70d7ee3487c4c7e2a34c9b4c0b3a8eadea3750"
            },
            "downloads": -1,
            "filename": "cexprtk-0.4.1-cp36-cp36m-musllinux_1_1_i686.whl",
            "has_sig": false,
            "md5_digest": "134d8591b1821ee1378a1d157c9add1c",
            "packagetype": "bdist_wheel",
            "python_version": "cp36",
            "requires_python": null,
            "size": 22988676,
            "upload_time": "2023-04-12T22:18:27",
            "upload_time_iso_8601": "2023-04-12T22:18:27.186870Z",
            "url": "https://files.pythonhosted.org/packages/47/ad/9f34bb29a2db219bdb1884fb7637a1d050f6da0760c692323ce2dc519afc/cexprtk-0.4.1-cp36-cp36m-musllinux_1_1_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "850eca438383d1dbdc0cf4358c17f368eb5a86946a2074ece0876244f8b78f24",
                "md5": "24808ab858455db2ec90e4f0bbf4fb50",
                "sha256": "6c3dd611ffbbb265cfbffef209ec17456db5f6dc5f99b019f713506aaf631427"
            },
            "downloads": -1,
            "filename": "cexprtk-0.4.1-cp36-cp36m-musllinux_1_1_x86_64.whl",
            "has_sig": false,
            "md5_digest": "24808ab858455db2ec90e4f0bbf4fb50",
            "packagetype": "bdist_wheel",
            "python_version": "cp36",
            "requires_python": null,
            "size": 22668181,
            "upload_time": "2023-04-12T22:18:50",
            "upload_time_iso_8601": "2023-04-12T22:18:50.309822Z",
            "url": "https://files.pythonhosted.org/packages/85/0e/ca438383d1dbdc0cf4358c17f368eb5a86946a2074ece0876244f8b78f24/cexprtk-0.4.1-cp36-cp36m-musllinux_1_1_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "6b5a252e1fe316057aee7aed56b980ade65fb1b3e0ba2633988ee05101f93306",
                "md5": "b80aee2a7f600b354c8185eb5d68535d",
                "sha256": "9bf13aeb01ed2d95b0e3f92137fd3bd2f5d366c6c13a73bb3e580a8ccbe6f573"
            },
            "downloads": -1,
            "filename": "cexprtk-0.4.1-cp36-cp36m-win32.whl",
            "has_sig": false,
            "md5_digest": "b80aee2a7f600b354c8185eb5d68535d",
            "packagetype": "bdist_wheel",
            "python_version": "cp36",
            "requires_python": null,
            "size": 791175,
            "upload_time": "2023-04-12T22:18:53",
            "upload_time_iso_8601": "2023-04-12T22:18:53.985666Z",
            "url": "https://files.pythonhosted.org/packages/6b/5a/252e1fe316057aee7aed56b980ade65fb1b3e0ba2633988ee05101f93306/cexprtk-0.4.1-cp36-cp36m-win32.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "e301f9ee37860b455825db58af9edfd3e7e96ce00e999f6945f2c08bd0f1b73f",
                "md5": "921e8309ac16e700f03b3e6cc2263a5e",
                "sha256": "547b9bfb7ffaba6b030456d4d594e2298e917dfb8f18bbc48696f3122de93332"
            },
            "downloads": -1,
            "filename": "cexprtk-0.4.1-cp36-cp36m-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "921e8309ac16e700f03b3e6cc2263a5e",
            "packagetype": "bdist_wheel",
            "python_version": "cp36",
            "requires_python": null,
            "size": 864230,
            "upload_time": "2023-04-12T22:18:57",
            "upload_time_iso_8601": "2023-04-12T22:18:57.214559Z",
            "url": "https://files.pythonhosted.org/packages/e3/01/f9ee37860b455825db58af9edfd3e7e96ce00e999f6945f2c08bd0f1b73f/cexprtk-0.4.1-cp36-cp36m-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "0704578a3716c51dd6eff3d128669abd9fa9cb7112dbc45d4446ae30449f2509",
                "md5": "c087d34f045f2c767428d5d5e901e363",
                "sha256": "46ecc5ea91bb8c0cc20de4b16163e74a42ddbff7e9eb836813d778f578c946ec"
            },
            "downloads": -1,
            "filename": "cexprtk-0.4.1-cp37-cp37m-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "c087d34f045f2c767428d5d5e901e363",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": null,
            "size": 2248049,
            "upload_time": "2023-04-12T22:19:01",
            "upload_time_iso_8601": "2023-04-12T22:19:01.129056Z",
            "url": "https://files.pythonhosted.org/packages/07/04/578a3716c51dd6eff3d128669abd9fa9cb7112dbc45d4446ae30449f2509/cexprtk-0.4.1-cp37-cp37m-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "534f69b583f3a41747e6cade35131fdac0e95a3b7863a7a9b04e77674a12068b",
                "md5": "a94fb9338983a12cb1cdddc760503017",
                "sha256": "ce99c11de9e0b10e8a490da3ca4516e1884a2167f2ec43d0d5bd4e34a1178fcd"
            },
            "downloads": -1,
            "filename": "cexprtk-0.4.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl",
            "has_sig": false,
            "md5_digest": "a94fb9338983a12cb1cdddc760503017",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": null,
            "size": 22352555,
            "upload_time": "2023-04-12T22:19:24",
            "upload_time_iso_8601": "2023-04-12T22:19:24.021902Z",
            "url": "https://files.pythonhosted.org/packages/53/4f/69b583f3a41747e6cade35131fdac0e95a3b7863a7a9b04e77674a12068b/cexprtk-0.4.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "5c3114356ec4c3ebdfc763d498622dce29470edc128c300d9f236a376ba6d8fb",
                "md5": "dbd60a8ed680979533f329a107526bd7",
                "sha256": "5d34d2fb90c38f3fdd3495b3ccdacd45ba2575caef6d9bc189db0592f62ea6d9"
            },
            "downloads": -1,
            "filename": "cexprtk-0.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "dbd60a8ed680979533f329a107526bd7",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": null,
            "size": 22927113,
            "upload_time": "2023-04-12T22:19:48",
            "upload_time_iso_8601": "2023-04-12T22:19:48.956094Z",
            "url": "https://files.pythonhosted.org/packages/5c/31/14356ec4c3ebdfc763d498622dce29470edc128c300d9f236a376ba6d8fb/cexprtk-0.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "24e39d80ca199ea7a611202d4924f21179ac06276502eb9631ae8f350c3f7fb6",
                "md5": "807cd8df902b4e27110955f54e93077b",
                "sha256": "5e95b772dc0cff067491d078980e329429fefab99db3138ff24222d23c3eb558"
            },
            "downloads": -1,
            "filename": "cexprtk-0.4.1-cp37-cp37m-musllinux_1_1_i686.whl",
            "has_sig": false,
            "md5_digest": "807cd8df902b4e27110955f54e93077b",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": null,
            "size": 22996290,
            "upload_time": "2023-04-12T22:20:13",
            "upload_time_iso_8601": "2023-04-12T22:20:13.061042Z",
            "url": "https://files.pythonhosted.org/packages/24/e3/9d80ca199ea7a611202d4924f21179ac06276502eb9631ae8f350c3f7fb6/cexprtk-0.4.1-cp37-cp37m-musllinux_1_1_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "f6e1c8f622d223d4aac601109d9f5961d19ca656d08b0f33b9d1f1d8d1ab02a9",
                "md5": "0f9a4f63797fb3a1b3fc59f807b373d2",
                "sha256": "f802703ed6e3604863089a765cfc5080eba91a93fd5d99db06ec2e96b76b7cd1"
            },
            "downloads": -1,
            "filename": "cexprtk-0.4.1-cp37-cp37m-musllinux_1_1_x86_64.whl",
            "has_sig": false,
            "md5_digest": "0f9a4f63797fb3a1b3fc59f807b373d2",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": null,
            "size": 22652672,
            "upload_time": "2023-04-12T22:20:36",
            "upload_time_iso_8601": "2023-04-12T22:20:36.369582Z",
            "url": "https://files.pythonhosted.org/packages/f6/e1/c8f622d223d4aac601109d9f5961d19ca656d08b0f33b9d1f1d8d1ab02a9/cexprtk-0.4.1-cp37-cp37m-musllinux_1_1_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "8b0c84e89a90407579ffc843c22e14fef70287bc00b8156b6da01f6a49203ca3",
                "md5": "504191ed2311ec3745bdd48d78fd60ab",
                "sha256": "49b423df047a1b1e52c68c32f968e09c8fe0023ac7c7c08d5ddc135083f4bb1e"
            },
            "downloads": -1,
            "filename": "cexprtk-0.4.1-cp37-cp37m-win32.whl",
            "has_sig": false,
            "md5_digest": "504191ed2311ec3745bdd48d78fd60ab",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": null,
            "size": 781884,
            "upload_time": "2023-04-12T22:20:40",
            "upload_time_iso_8601": "2023-04-12T22:20:40.887469Z",
            "url": "https://files.pythonhosted.org/packages/8b/0c/84e89a90407579ffc843c22e14fef70287bc00b8156b6da01f6a49203ca3/cexprtk-0.4.1-cp37-cp37m-win32.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "b17d4753113f50e8b2034d1ac894e7a3a115151144df65f19efcd32ea8a283eb",
                "md5": "b78e9cfd625b5a725f5bb7890016886a",
                "sha256": "bb00adfa6b08e3251688686e78cff51da018da48ae81f243a30ad676272f8db6"
            },
            "downloads": -1,
            "filename": "cexprtk-0.4.1-cp37-cp37m-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "b78e9cfd625b5a725f5bb7890016886a",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": null,
            "size": 851230,
            "upload_time": "2023-04-12T22:20:43",
            "upload_time_iso_8601": "2023-04-12T22:20:43.880247Z",
            "url": "https://files.pythonhosted.org/packages/b1/7d/4753113f50e8b2034d1ac894e7a3a115151144df65f19efcd32ea8a283eb/cexprtk-0.4.1-cp37-cp37m-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "4569d09ce906a1eb610fb8a1b1242f4df83b89bbd092c20bf3281735858cd6e1",
                "md5": "49ed6a2e0006fd7eb4b5f17bcf782999",
                "sha256": "11df965b4971b1d7af507e163d14a1690a592eef9823c623cec7d087a996911f"
            },
            "downloads": -1,
            "filename": "cexprtk-0.4.1-cp38-cp38-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "49ed6a2e0006fd7eb4b5f17bcf782999",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": null,
            "size": 2245226,
            "upload_time": "2023-04-12T22:20:49",
            "upload_time_iso_8601": "2023-04-12T22:20:49.107559Z",
            "url": "https://files.pythonhosted.org/packages/45/69/d09ce906a1eb610fb8a1b1242f4df83b89bbd092c20bf3281735858cd6e1/cexprtk-0.4.1-cp38-cp38-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "0d3b161d26deaf4fbaeffe74c0f849fdef7a592e7112cc369e01ba5844058f4e",
                "md5": "4fb8d08b0c7d36f7228c496fdbc112b3",
                "sha256": "fe69c682bc9f3df65f196f4f1f90fc144c7b088e14f894e024efc08fc9058691"
            },
            "downloads": -1,
            "filename": "cexprtk-0.4.1-cp38-cp38-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "4fb8d08b0c7d36f7228c496fdbc112b3",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": null,
            "size": 2073033,
            "upload_time": "2023-04-12T22:20:53",
            "upload_time_iso_8601": "2023-04-12T22:20:53.929375Z",
            "url": "https://files.pythonhosted.org/packages/0d/3b/161d26deaf4fbaeffe74c0f849fdef7a592e7112cc369e01ba5844058f4e/cexprtk-0.4.1-cp38-cp38-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "c1b3e391a519eb4e7236380394101b2ffb50c575ba124f19089eb87bca2dd806",
                "md5": "f2ecc9528f693d8cae9a85b2d6a98b79",
                "sha256": "05d2b245e8bbd7becbf24da9b376751078d60c5c8a11655cbb1f259a00316110"
            },
            "downloads": -1,
            "filename": "cexprtk-0.4.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl",
            "has_sig": false,
            "md5_digest": "f2ecc9528f693d8cae9a85b2d6a98b79",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": null,
            "size": 22537958,
            "upload_time": "2023-04-12T22:21:15",
            "upload_time_iso_8601": "2023-04-12T22:21:15.941655Z",
            "url": "https://files.pythonhosted.org/packages/c1/b3/e391a519eb4e7236380394101b2ffb50c575ba124f19089eb87bca2dd806/cexprtk-0.4.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "aab39d464cc0f74ccfb6f3879a8bdcd173c2b42fb1f26c7dba8e453a5faf1e0b",
                "md5": "1de489b047e23f9402a3d7d5d4cb5d36",
                "sha256": "7abd16ce6158da8d0607b5c0cf34fd601d677cd46520d3d379f07c0a3b4076f9"
            },
            "downloads": -1,
            "filename": "cexprtk-0.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "1de489b047e23f9402a3d7d5d4cb5d36",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": null,
            "size": 23102254,
            "upload_time": "2023-04-12T22:21:39",
            "upload_time_iso_8601": "2023-04-12T22:21:39.567575Z",
            "url": "https://files.pythonhosted.org/packages/aa/b3/9d464cc0f74ccfb6f3879a8bdcd173c2b42fb1f26c7dba8e453a5faf1e0b/cexprtk-0.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "7cb949a37484c8834f17a392c0b8a0d55aa1dd0850984932240945a80564c4a2",
                "md5": "d4c250a4693467ec19fb7b5c269a92a0",
                "sha256": "f6f4c972e303ec135f89514bfc6c5450f0eaa78e7f8b2062f0d1d29cd716687b"
            },
            "downloads": -1,
            "filename": "cexprtk-0.4.1-cp38-cp38-musllinux_1_1_i686.whl",
            "has_sig": false,
            "md5_digest": "d4c250a4693467ec19fb7b5c269a92a0",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": null,
            "size": 23191109,
            "upload_time": "2023-04-12T22:22:05",
            "upload_time_iso_8601": "2023-04-12T22:22:05.059105Z",
            "url": "https://files.pythonhosted.org/packages/7c/b9/49a37484c8834f17a392c0b8a0d55aa1dd0850984932240945a80564c4a2/cexprtk-0.4.1-cp38-cp38-musllinux_1_1_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "01063c4855d577b3049542ab3598a880a1a2dc9bc4926a06faded6ccb41aceb0",
                "md5": "f6f559ce11af4900f6f5e6aa3014ff47",
                "sha256": "b833e7e03984beba5cc208f78af2d709f0a57f9d5fd34efaa71aea8a0b54f10c"
            },
            "downloads": -1,
            "filename": "cexprtk-0.4.1-cp38-cp38-musllinux_1_1_x86_64.whl",
            "has_sig": false,
            "md5_digest": "f6f559ce11af4900f6f5e6aa3014ff47",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": null,
            "size": 22880654,
            "upload_time": "2023-04-12T22:22:29",
            "upload_time_iso_8601": "2023-04-12T22:22:29.491488Z",
            "url": "https://files.pythonhosted.org/packages/01/06/3c4855d577b3049542ab3598a880a1a2dc9bc4926a06faded6ccb41aceb0/cexprtk-0.4.1-cp38-cp38-musllinux_1_1_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "ae0840c2b567f3a4aff430990bc600f9ebdba065dd40bb57a322d786da46e602",
                "md5": "afad261c6303021e8c923fc24212c2f0",
                "sha256": "4a16b5bae186fcb7a1ed127d0cd7f382b8c28ef19de63f79e175d7dc81a32b60"
            },
            "downloads": -1,
            "filename": "cexprtk-0.4.1-cp38-cp38-win32.whl",
            "has_sig": false,
            "md5_digest": "afad261c6303021e8c923fc24212c2f0",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": null,
            "size": 787055,
            "upload_time": "2023-04-12T22:22:32",
            "upload_time_iso_8601": "2023-04-12T22:22:32.719987Z",
            "url": "https://files.pythonhosted.org/packages/ae/08/40c2b567f3a4aff430990bc600f9ebdba065dd40bb57a322d786da46e602/cexprtk-0.4.1-cp38-cp38-win32.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "546e4cbfe7cef9a4eadff5371367fdf9f07975de188e36adb302a1bd3275d99e",
                "md5": "a9f8200ee4b8812570605209dc1c0d73",
                "sha256": "8e8f46fc4f7a0e30bb1b1fe9ef257e611f7e92c91a5c1be23019a7015381c19c"
            },
            "downloads": -1,
            "filename": "cexprtk-0.4.1-cp38-cp38-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "a9f8200ee4b8812570605209dc1c0d73",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": null,
            "size": 857687,
            "upload_time": "2023-04-12T22:22:35",
            "upload_time_iso_8601": "2023-04-12T22:22:35.785450Z",
            "url": "https://files.pythonhosted.org/packages/54/6e/4cbfe7cef9a4eadff5371367fdf9f07975de188e36adb302a1bd3275d99e/cexprtk-0.4.1-cp38-cp38-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "588ced58a44b339d59374b4936aaccb17dc10bdcfbcdd9816a00ba55dd635df7",
                "md5": "2442fb64ded1cc1296e0c5d4ba9f1f13",
                "sha256": "95e69ca7ada4fb9cab55542601ca39e642f5a67b80f0c984b5d4958260d41097"
            },
            "downloads": -1,
            "filename": "cexprtk-0.4.1-cp39-cp39-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "2442fb64ded1cc1296e0c5d4ba9f1f13",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": null,
            "size": 2247162,
            "upload_time": "2023-04-12T22:22:39",
            "upload_time_iso_8601": "2023-04-12T22:22:39.866736Z",
            "url": "https://files.pythonhosted.org/packages/58/8c/ed58a44b339d59374b4936aaccb17dc10bdcfbcdd9816a00ba55dd635df7/cexprtk-0.4.1-cp39-cp39-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "0fba8200b65838598f3ad6dc43a53d389bfd349d731260da024c2c89c60561ae",
                "md5": "468cec4522cca79fae4d7934d6055d14",
                "sha256": "7abeef15b5623fe1169a4dbc16ade2de88128a15a1f2708c83c663c0268bcbb9"
            },
            "downloads": -1,
            "filename": "cexprtk-0.4.1-cp39-cp39-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "468cec4522cca79fae4d7934d6055d14",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": null,
            "size": 2072407,
            "upload_time": "2023-04-12T22:22:46",
            "upload_time_iso_8601": "2023-04-12T22:22:46.052936Z",
            "url": "https://files.pythonhosted.org/packages/0f/ba/8200b65838598f3ad6dc43a53d389bfd349d731260da024c2c89c60561ae/cexprtk-0.4.1-cp39-cp39-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "f708c18e2cb2346b8ddd8ebf239073e09c94adcf08b69a449864aa9ed5c3a001",
                "md5": "7904761f1fa65b0068c1c1e44b8eb5de",
                "sha256": "3d32590cb2a0ddc681e3c51577293424b58549487c52fdf3c900ea164a82144d"
            },
            "downloads": -1,
            "filename": "cexprtk-0.4.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl",
            "has_sig": false,
            "md5_digest": "7904761f1fa65b0068c1c1e44b8eb5de",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": null,
            "size": 22483919,
            "upload_time": "2023-04-12T22:23:08",
            "upload_time_iso_8601": "2023-04-12T22:23:08.232572Z",
            "url": "https://files.pythonhosted.org/packages/f7/08/c18e2cb2346b8ddd8ebf239073e09c94adcf08b69a449864aa9ed5c3a001/cexprtk-0.4.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "4792a7fa2b6eb0978575f9e779364bc18892bb2563288c79766a7ef2b6befd51",
                "md5": "7d15e1a4e23a03529adc165786a921d9",
                "sha256": "682d0059c727f77b99fc7e4b8928e32449d5e7d1fc0fd6223998e03fabc576c4"
            },
            "downloads": -1,
            "filename": "cexprtk-0.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "7d15e1a4e23a03529adc165786a921d9",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": null,
            "size": 23041556,
            "upload_time": "2023-04-12T22:23:31",
            "upload_time_iso_8601": "2023-04-12T22:23:31.843214Z",
            "url": "https://files.pythonhosted.org/packages/47/92/a7fa2b6eb0978575f9e779364bc18892bb2563288c79766a7ef2b6befd51/cexprtk-0.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "8b9cd5f477dfac4cac8bf6ffecab8b121d9748a58bdccd85e12997f13ea89ad9",
                "md5": "218145ad7ede38a7753d2a16f0026405",
                "sha256": "d521b16103a9b8289c63812a6948ca8042d47e611b747f787568a85a22e6aff6"
            },
            "downloads": -1,
            "filename": "cexprtk-0.4.1-cp39-cp39-musllinux_1_1_i686.whl",
            "has_sig": false,
            "md5_digest": "218145ad7ede38a7753d2a16f0026405",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": null,
            "size": 23123773,
            "upload_time": "2023-04-12T22:23:56",
            "upload_time_iso_8601": "2023-04-12T22:23:56.730652Z",
            "url": "https://files.pythonhosted.org/packages/8b/9c/d5f477dfac4cac8bf6ffecab8b121d9748a58bdccd85e12997f13ea89ad9/cexprtk-0.4.1-cp39-cp39-musllinux_1_1_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "cbc461d90605d7acded24b1f54b941e81405748051cedcc9b08764aa0eeeb596",
                "md5": "86058f652ed2cf8de95f568af007a0d6",
                "sha256": "6b4a7ae5b94bf27ab9eb4225db59762c7ee6a5f0f2053e115323e563f1011757"
            },
            "downloads": -1,
            "filename": "cexprtk-0.4.1-cp39-cp39-musllinux_1_1_x86_64.whl",
            "has_sig": false,
            "md5_digest": "86058f652ed2cf8de95f568af007a0d6",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": null,
            "size": 22788541,
            "upload_time": "2023-04-12T22:24:21",
            "upload_time_iso_8601": "2023-04-12T22:24:21.799131Z",
            "url": "https://files.pythonhosted.org/packages/cb/c4/61d90605d7acded24b1f54b941e81405748051cedcc9b08764aa0eeeb596/cexprtk-0.4.1-cp39-cp39-musllinux_1_1_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "eb8379c9d54f452fe1c994f7194d275a5bdcbd37ab563aa0b6e74f1e3f499f8a",
                "md5": "c4bdbb3f0f9c7f65bcd01694372e1b01",
                "sha256": "a076bb35ab421e512e3299463b32c49b2268207cbe0bc18f58a9fa94156d8401"
            },
            "downloads": -1,
            "filename": "cexprtk-0.4.1-cp39-cp39-win32.whl",
            "has_sig": false,
            "md5_digest": "c4bdbb3f0f9c7f65bcd01694372e1b01",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": null,
            "size": 787288,
            "upload_time": "2023-04-12T22:24:24",
            "upload_time_iso_8601": "2023-04-12T22:24:24.942350Z",
            "url": "https://files.pythonhosted.org/packages/eb/83/79c9d54f452fe1c994f7194d275a5bdcbd37ab563aa0b6e74f1e3f499f8a/cexprtk-0.4.1-cp39-cp39-win32.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "a25006d824970820b9a175f56aec919255bb6e06c1c805a55c26545c48ff3798",
                "md5": "ff7315f9398813bf27f779bf458bc178",
                "sha256": "2112958927b3ffd2c56f7ecf937228465d3a3265e48e64f34e8661d8a5e6c8e6"
            },
            "downloads": -1,
            "filename": "cexprtk-0.4.1-cp39-cp39-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "ff7315f9398813bf27f779bf458bc178",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": null,
            "size": 858350,
            "upload_time": "2023-04-12T22:24:27",
            "upload_time_iso_8601": "2023-04-12T22:24:27.865265Z",
            "url": "https://files.pythonhosted.org/packages/a2/50/06d824970820b9a175f56aec919255bb6e06c1c805a55c26545c48ff3798/cexprtk-0.4.1-cp39-cp39-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "8e599cf2113ce3a7064473475ad5ab811ae5dc7a15f159e54bc2b2b17598b74d",
                "md5": "0107b3c06c1b491bc09aee74a466b2e5",
                "sha256": "4217ed2326ee7d53cefd86cb172711e2a60402d40c7113cfe63292ea8e9d1598"
            },
            "downloads": -1,
            "filename": "cexprtk-0.4.1.tar.gz",
            "has_sig": false,
            "md5_digest": "0107b3c06c1b491bc09aee74a466b2e5",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": null,
            "size": 726541,
            "upload_time": "2023-04-12T22:24:30",
            "upload_time_iso_8601": "2023-04-12T22:24:30.738896Z",
            "url": "https://files.pythonhosted.org/packages/8e/59/9cf2113ce3a7064473475ad5ab811ae5dc7a15f159e54bc2b2b17598b74d/cexprtk-0.4.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2023-04-12 22:24:30",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "github_user": "mjdrushton",
    "github_project": "cexprtk",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "tox": true,
    "lcname": "cexprtk"
}
        
Elapsed time: 0.88354s