Give any iterable object capability to use .one(), .one_or_none(), .many(k), .skip(k), .all() API.
Project description
⏩ Welcome to iterproxy Documentation
You may seen the following code style in many ORM framework, this pattern provides a user friendly API to access items from the iterator object:
query(...).one()
query(...).one_or_none()
query(...).many(3)
query(...).all(5)
query(...).skip(5).many(3)
iterproxy library can give any iterable object similar capabilities.
Usage Example
Convert any iterable object to a IterProxy object:
from iterproxy import IterProxy
# Suppose you have an iterable object
iterator = range(10)
# Convert it to a IterProxy object
proxy = IterProxy(iterator)
Access items from the IterProxy object:
proxy = IterProxy(range(10))
proxy.one() # it will return 0
proxy.many(3) # it will return [1, 2, 3]
proxy.skip(2).many(2) # it will skip [4, 5] and return [6, 7]
proxy.all() # it will return the rest [8, 9]
proxy.one_or_none() # it will return None
IterProxy.iter_chunks can group items into chunks having K items, the last chunk may have less items than K:
proxy = IterProxy(range(3))
list(proxy.iter_chunks(2)) # it will return [[0, 1], [2]]
Another example:
proxy = IterProxy(range(10))
proxy.all() # it will return [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Of course the IterProxy itself is a iterator:
for i in IterProxy(range(10)): # 0, 1, 2, ...
...
You can use custom filter function to filter the result. Other than the nesting style in built-in filter function, it use chain pattern.
def is_odd(x):
return x % 2 == 1
def gte_5(x):
return x >= 5
# with IterProxy, you can chain them
# it returns you [5, 7, 9]
for i in IterProxy(range(10)).filter(is_odd).filter(gte_5):
print(i)
# or put them together, by default, it is logic and
for i in IterProxy(range(10)).filter(is_odd, gte_5):
print(i)
# with the built-in filter, this is not that intuitive
for i in filter(gte_5, filter(is_odd, range(10))):
...
You can also use compound logic and_, or_, not_:
def is_odd(i):
return i % 2
def is_even(i):
return not (i % 2)
def lte_3(i):
return i <= 3
def gte_4(i):
return i >= 4
def lte_6(i):
return i <= 6
def gte_7(i):
return i >= 7
IterProxy(range(10)).filter(and_(gte_4, lte_6)).all() # [4, 5, 6]
IterProxy(range(10)).filter(or_(lte_3, gte_7)).all() # [0, 1, 2, 3, 7, 8, 9]
IterProxy(range(10)).filter(not_(is_odd)).all() # [0, 2, 4, 6, 8]
# of course you can nest and_, or_, not_
IterProxy(range(10)).filter(not_(and_(is_odd, or_(lte_3, gte_7)))).all() # [0, 2, 4, 5, 6, 8]
(Advanced) In order to enable type hint, you can do:
from iterproxy import IterProxy
class Dog:
def bark(self):
pass
class DogIterProxy(IterProxy[Dog]): # subclass from IterProxy[${YourTypeHint}]
pass
many_dogs = [Dog(),]*10
proxy = DogIterProxy(many_dogs)
proxy.one_or_none().bark()
for dog in proxy.many(2):
dog.bark()
for dog in proxy.skip(1).many(2):
dog.bark()
for dog in proxy.all():
dog.bark()
filtered_proxy = DogIterProxy(many_dogs).filter(lambda dog: True)
filtered_proxy.one_or_none().bark()
for dog in filtered_proxy.many(2):
dog.bark()
for dog in filtered_proxy.skip(1).many(2):
dog.bark()
for dog in filtered_proxy.all():
dog.bark()
Install
iterproxy is released on PyPI, so all you need is:
$ pip install iterproxy
To upgrade to latest version:
$ pip install --upgrade iterproxy
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
File details
Details for the file iterproxy-0.3.1.tar.gz
.
File metadata
- Download URL: iterproxy-0.3.1.tar.gz
- Upload date:
- Size: 11.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.8.13
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | a832d71822e5f658cb3e9c7624496383b57c43c7f51a3aa4eb1f4b986fdd1317 |
|
MD5 | 9358ac9f58f264e2c06fa46d05275682 |
|
BLAKE2b-256 | bec86dddbff88a70d9c8d389b1a0d0670a357c1bf3a151c0b0c7cd24b8fb535a |
File details
Details for the file iterproxy-0.3.1-py2.py3-none-any.whl
.
File metadata
- Download URL: iterproxy-0.3.1-py2.py3-none-any.whl
- Upload date:
- Size: 8.2 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.8.13
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | bf52ad378298db94866631ad78cc3e0332c897ba5f2cd53a02ba5a900a932f70 |
|
MD5 | b197d07c20292b0f3eb86ebc8653730f |
|
BLAKE2b-256 | c51a0076370bd1c7f16bab017378d5258b7396a70d5552296399e644da2b7421 |