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
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
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
filterutil-2.0.0.tar.gz
(10.6 kB
view details)
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.0.tar.gz.
File metadata
- Download URL: filterutil-2.0.0.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 |
1563635f8f237b8adc9f321cc6865eef3a9cad81739bf06d56dda629a279f482
|
|
| MD5 |
5de744b77454c01301c883128c3d4463
|
|
| BLAKE2b-256 |
3087da423cc79d982bb3631b85b99ea09a0fa744a669d2e8c52f428613f7335b
|
File details
Details for the file filterutil-2.0.0-py3-none-any.whl.
File metadata
- Download URL: filterutil-2.0.0-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 |
4dfe6464db3dedfd07f686061dd4908363ffe3d94343687f977fbd4f374a7680
|
|
| MD5 |
537a9a7ab854727acd653e9d1ff2d719
|
|
| BLAKE2b-256 |
2a65fc57ebc07eb9e12d0e0b79ce5b4ed62c3a646e7876a923eb2f7ae0b96f98
|