Let you register and use filters in right way
Project description
filterutil
filterutil is simple, yet very powerful filtering tool.
How to install
You could install from PyPi:
$ python3 -m pip install filterutil
How to use
Simple filter
from filterutil import Filter
def test_func():
my_filter = Filter(lambda x: x == 1)
# assert False
assert not my_filter.apply(2):
Filter with saved args and kwargs
from typing import Set
from filterutil import Filter
def filtering_func(value: int, y: int):
return value == y
def test_func():
# saved args works
my_filter = Filter(filtering_func, 1)
# but we recommend to use kwargs
my_filter = Filter(filtering_func, y=1)
# assert False
assert not my_filter.apply(2):
# .apply under the hood works as
assert not filtering_func(2, y=1)
# assert True
assert my_filter.apply(1):
Coupling filters with AND logic gate
True only if all inputs are True.
from filterutil import Filter
def test_func():
a = Filter(lambda x: x == 1)
b = Filter(lambda x: isinstance(x, int))
compound_filter = a & b
# order matters:
# "compound_filter = a & b" means first a then b
# "compound_filter = b & a" means first b then a
# assert False
assert not compound_filter.apply(2)
Coupling filters with OR logic gate
True if at least one input is True.
from filterutil import Filter
def test_func():
a = Filter(lambda x: x == 1)
b = Filter(lambda x: isinstance(x, int))
# order still matters
compound_filter = a | b
# assert True
assert compound_filter.apply(2)
Coupling filters with XOR logic gate
True if exactly one input is True.
from filterutil import Filter
def test_func():
a = Filter(lambda x: x == 2)
b = Filter(lambda x: isintance(x, int))
compound_filter = a ^ b
# assert True
assert compound_filter.apply(1)
# assert False
assert not compound_filter.apply(2)
Coupling filters with XNOR logic gate
True if both inputs are the same.
from filterutil import Filter
def test_func():
a = Filter(lambda x: x == 2)
b = Filter(lambda x: isintance(x, str))
compound_filter = a.xnor(b)
# assert True
assert compound_filter.apply(1)
Coupling filters with NOR logic gate
True only if all inputs are False.
from filterutil import Filter
def test_func():
a = Filter(lambda x: x == 2)
b = Filter(lambda x: isintance(x, str))
compound_filter = a.nor(b)
# assert True
assert compound_filter.apply(1)
Coupling filters with NAND logic gate
False only if all inputs are True.
from filterutil import Filter
def test_func():
a = Filter(lambda x: x == 1)
b = Filter(lambda x: isintance(x, int))
compound_filter = a.nand(b)
# assert False
assert not compound_filter.apply(1)
Infinite nesting
from filterutil import Filter
def test_func():
a = Filter(lambda x: isinstance(x, int))
b = Filter(lambda x: isinstance(x, str))
c = Filter(lambda x: x == 1)
# multiline
compound_filter = a | b
compound_filter = compound_filter & c
# order is: (a or b) and c
# assert False
assert not compound_filter.apply(2)
# is not the same as inline
# because of python operator precedence
compound_filter = filter_a | filter_b & filter_c
# order is: a or (b and c)
# assert True
assert compound_filter.apply(2)
Collection of filters with same logic gate
from filterutil import (
Filter,
Filters,
OrFilters,
XorFilters,
XnorFilters,
NandFilters,
NorFilters,
LogicGate,
)
def test_func():
# Filters is AND collection by default
and_filters = Filters()
and_filters['a'] = Filter(lambda x: isinstance(x, int))
and_filters['b'] = Filter(lambda x: isinstance(x, str))
# same as
and_filters = Filters(
a=Filter(lambda x: isinstance(x, int)),
b=Filter(lambda x: isinstance(x, str)),
)
# ---
# assert False
assert not and_filters.apply(2)
# OR collection
or_filters = OrFilters()
#same as
or_filters = Filters(LogicGate.OR)
# ---
or_filters['a'] = Filter(lambda x: isinstance(x, int))
or_filters['b'] = Filter(lambda x: isinstance(x, str))
# assert True
assert or_filters.apply(2)
# XOR collection
xor_filters = XorFilters()
#same as
xor_filters = Filters(LogicGate.XOR)
# ---
xor_filters['a'] = Filter(lambda x: isinstance(x, bool))
xor_filters['b'] = Filter(lambda x: isinstance(x, str))
# assert True
assert xor_filters.apply(False)
# another logic collections
xnor_filters = XnorFilters()
nor_filters = NorFilters()
nand_filters = NandFilters()
Supported logic gates
from enum import StrEnum
class LogicGate(StrEnum):
"""
Enum of logic gate
"""
AND = 'and'
OR = 'or'
XOR = 'xor'
XNOR = 'xnor'
NAND = 'nand'
NOR = 'nor'
It is possible to select certain filters of collection
from filterutil import Filter, Filters, OrFilters
def test_func():
and_filters = Filters(
a=Filter(lambda x: x == 2),
b=Filter(lambda x: isinstance(x, int)),
c=Filter(lambda x: isinstance(x, str)),
)
assert and_filters.apply(2, filter_names=['a', 'b'])
assert not and_filters.apply(2, filter_names=['b', 'c'])
or_filters = OrFilters(
a=Filter(lambda x: x == 1),
b=Filter(lambda x: isinstance(x, int)),
c=Filter(lambda x: isinstance(x, str)),
)
assert or_filters.apply(2, filter_names=['a', 'b'])
assert not or_filters.apply(2, filter_names=['a', 'c'])
Apply another logic gate for the collection dinamically
from filterutil import Filter, Filters, OrFilters, LogicGate
def test_func():
and_filters = Filters(
a=Filter(lambda x: x == 1),
b=Filter(lambda x: isinstance(x, int)),
)
assert not and_filters.apply(2)
assert and_filters.apply_or(2)
# or
assert and_filters.apply(2, logic_gate=LogicGate.OR)
or_filters = OrFilters(
a=Filter(lambda x: x == 1),
b=Filter(lambda x: isinstance(x, int)),
)
assert or_filters.apply(2)
assert or_filters.apply_xor(2)
assert not or_filters.apply_and(2)
Infinite nesting of collections
from filterutil import Filter, Filters, OrFilters, XorFilters, LogicGate
def test_func():
and_filters = Filters(
LogicGate.AND,
a=Filter(lambda x: isinstance(x, int)),
b=Filter(lambda x: isinstance(x, str)),
)
xor_filters = Filters(
LogicGate.XOR,
a=Filter(lambda x: x == 1),
b=Filter(lambda x: isintance(x, int)),
)
two_collections_in_one = OrFilters(
first=and_filters,
second=xor_filters,
)
# assert True
assert two_collections_in_one.apply(2)
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file filterutil-2.0.1.tar.gz.
File metadata
- Download URL: filterutil-2.0.1.tar.gz
- Upload date:
- Size: 10.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6f2ea216e5c0d1399164fa7acdaf3faf3d0cc7383aab9ab4bf77146f60c2c7dd
|
|
| MD5 |
6988f44edf9accdb63195aa47e1fb2d3
|
|
| BLAKE2b-256 |
c4d0917bd1787c52c7a7bfc15717b7b447cd8edea376d4ef52b72cd3d1a977e3
|
File details
Details for the file filterutil-2.0.1-py3-none-any.whl.
File metadata
- Download URL: filterutil-2.0.1-py3-none-any.whl
- Upload date:
- Size: 10.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
34f1a70c5e93ab63937766888302b02f239f0c531f3b48b8541763a1bfd5c6a8
|
|
| MD5 |
93cab5ac48663571a59ba0bcded38d3b
|
|
| BLAKE2b-256 |
a89a002e7a0e89f6243d7b892603bd884fa2cf2a260c336f5d8f6dbc90478d08
|