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.4.tar.gz (6.7 kB view hashes)

Uploaded Source

Built Distribution

smarter-0.1.4-py3-none-any.whl (6.6 kB view hashes)

Uploaded Python 3

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