Skip to main content

Some objects could be smarter

Project description

Smarter

codecov CI

Some objects could be smarter

pip install smarter

SmartList

regular list operations

from smarter import SmartList

colors = SmartList(['red', 'green', 'blue'])

colors.append('yellow')
colors.extend(['orange', 'purple'])
colors.insert(1, 'black')
colors.remove('black')

smart list operations

colors.first() # 'red'
colors.last() # 'purple'
colors.first_or(13) # 'red'
colors.last_or("default") # 'purple'

items = SmartList([])  # empty list
items.first_or(13) # 13
items.last_or("default") # 'default'

items = SmartList([None, "", [], 13])
items.first_not_null() # ""

items = SmartList([None, "", [], 13])
items.first_not_nullable() # 13

Smart Result Wrapper

Instead of calling error prone functions, wrap it in a Result object

def this_fails(x):
    return x / 0

w = Result(this_fails, 5)  # instead of w = this_fails(5)

w.is_error() # True
w.is_ok() # False
w.exc # ZeroDivisionError
w.unwrap_or(5) # 5
w.unwrap_or_else(lambda: 5) # 5
w.and_then(lambda x: x + 1, 5) # Raises ZerodivisionError
w.unwrap() # Raises ZeroDivisionError
def this_succeeds(x):
    return 1 + x

w = Result(this_succeeds, 5)  # Instead of w = this_succeeds(5)
w.is_error() # False
w.is_ok() # True
w.exc # None
w.unwrap_or(5) # 6
w.unwrap_or_else(lambda: 'default') # 6
w.and_then(lambda value, x: value * x, 5).unwrap() # 30
w.unwrap() # 6

def double_integer(x):
    return x * 2

result = (
  w.and_then(double_integer)  # 12
   .and_then(double_integer)  # 24
   .and_then(double_integer)  # 48
   .and_then(double_integer)  # 96
   .unwrap()
) # 96

w.ok() # 6

By default all exceptions are wrapped in a Result object but it is possible to specify the exception type.

person = {'name': 'John', 'age': '25'}
w = Result(person.__getitem__, 'city', suppress=KeyError)
w.is_error() # True
w.exc # KeyError
w.unwrap_or('Gotham') # 'Gotham'

# When exception type is specified, other exceptions are not wrapped
# raising the original exception eagerly/immediately.
w = Result(person.get, 'city', 'other', 'another', suppress=KeyError)
Traceback (most recent call last):
...
TypeError: get expected at most 2 arguments, got 3

However the above example is better covered by the smart >> get described below.

Smart get operations

Given the following objects

person = {'name': 'John', 'age': 30}
colors = ['red', 'green', 'blue']
position = (1, 2, 6, 9)

class Person:
    name = "John"

Ubiquitous get operations using >> operator

# On a `dict` gets by `key`
person >> get('name') # 'John'
person >> get('age') # 30
person >> get('city', default='Gotham') # Gotham

# On a `list` gets by `index`
colors >> get(0) # 'red'
colors >> get(1) # 'green'
colors >> get(2) # 'blue'
colors >> get(3) # None
colors >> get(4, "default") # 'default'

# On a `tuple` gets by `index`
position >> get(0) # 1
position >> get(1) # 2

# On a `class` gets by `attribute`
p = Person()
p >> get('name') # 'John'
p >> get('age', default=45) # 45

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

smarter-0.1.3.tar.gz (6.7 kB view details)

Uploaded Source

Built Distribution

smarter-0.1.3-py3-none-any.whl (6.6 kB view details)

Uploaded Python 3

File details

Details for the file smarter-0.1.3.tar.gz.

File metadata

  • Download URL: smarter-0.1.3.tar.gz
  • Upload date:
  • Size: 6.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.9.6

File hashes

Hashes for smarter-0.1.3.tar.gz
Algorithm Hash digest
SHA256 7aad9f71f7e6588618d5617679bc383df52478e15e9d3afff46faa80d778de1d
MD5 fac10549f5277a5475f27b20c7e17d8a
BLAKE2b-256 978ca5cf0390ba38c8a18e52470783bf67f29fc4c768209c7d5e70baaaaef971

See more details on using hashes here.

File details

Details for the file smarter-0.1.3-py3-none-any.whl.

File metadata

  • Download URL: smarter-0.1.3-py3-none-any.whl
  • Upload date:
  • Size: 6.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.9.6

File hashes

Hashes for smarter-0.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 e327cfa7ddfd9167ab4852a2b46bd85d3c8f15dfe05c627b2cb1c8d8927a00ce
MD5 9e8562764c71f83b8c769a716f841c8a
BLAKE2b-256 3b2e4ec45dd1d183e2842e9dd3fca5a7f3861243c019ba81ae68a9db7a14611a

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page