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(tags: Set[str], tag: str):
return tag in tags
def test_func():
my_filter = Filter(filtering_func, 'c')
# or
my_filter = Filter(filtering_func, tag='c')
tags = {'a', 'b'}
# assert False
assert not my_filter.apply(tags):
tags = {'a', 'c'}
# assert True
assert my_filter.apply(tags):
Coupling filters with AND policy
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 policy
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 policy
from filterutil import Filter
def test_func():
a = Filter(lambda x: x == 1)
b = Filter(lambda x: x == 3)
compound_filter = a ^ b
# assert True
assert compound_filter.apply(2)
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 policy
from filterutil import Filter, Filters, OrFilters, XorFilters, FilterCouplingPolicy
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(FilterCouplingPolicy.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(FilterCouplingPolicy.XOR)
# ---
xor_filters['a'] = Filter(lambda x: isinstance(x, int))
xor_filters['b'] = Filter(lambda x: isinstance(x, str))
# assert True
assert xor_filters.apply(False)
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 coupling policy for the collection dinamically
from filterutil import Filter, Filters, OrFilters, FilterCouplingPolicy
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, coupling_policy=FilterCouplingPolicy.OR)
or_filters = OrFilters(
a=Filter(lambda x: x == 1),
b=Filter(lambda x: isinstance(x, int)),
)
assert or_filters.apply(2)
assert not or_filters.apply_and(2)
assert not or_filters.apply_xor(2)
Infinite nesting of collections
from filterutil import Filter, Filters, OrFilters, XorFilters, FilterCouplingPolicy
def test_func():
and_filters = Filters(
FilterCouplingPolicy.AND,
a=Filter(lambda x: isinstance(x, int)),
b=Filter(lambda x: isinstance(x, str)),
)
xor_filters = Filters(
FilterCouplingPolicy.XOR,
a=Filter(lambda x: x == 1),
b=Filter(lambda x: x == 3),
)
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-1.0.2.tar.gz
(9.0 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-1.0.2.tar.gz.
File metadata
- Download URL: filterutil-1.0.2.tar.gz
- Upload date:
- Size: 9.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ba72ef8219c698f331525630a009defa36943de78ace2c88add994bed072ba5e
|
|
| MD5 |
06bf6659c5017d932dd1928bf79a28b7
|
|
| BLAKE2b-256 |
54968b8bbce229b6a5992159e5047da7e03d08dc1c2151e6e8ebad40b4387008
|
File details
Details for the file filterutil-1.0.2-py3-none-any.whl.
File metadata
- Download URL: filterutil-1.0.2-py3-none-any.whl
- Upload date:
- Size: 8.9 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 |
cb82d83a55b0df59e5b9eeec491d16232403dd62e0b0c529bcb0755276775ffc
|
|
| MD5 |
ee52c9516410c66080f717c7e8f0b2ad
|
|
| BLAKE2b-256 |
8c9adad41d7b3ec78aabfcc903c311ac1edae0e6594cdd4374503b3a5b8c06ed
|