Skip to main content

A Python 3 library to manipulate objects with shared mutable wrappers

Project description

SmartWrappers

A Python 3 library to manipulate objects with shared mutable wrappers.

Installing

Python 3.6.8 or higher is required

To install the library, you can just run the following command:

# Linux/macOS
python3 -m pip install -U smartwrappers

# Windows
py -3 -m pip install -U smartwrappers

Cases to use

# We cannot change immutable objects.
# Trying to change them we just create other objects.

def plus_five(x):
    x += 5  # Creating another object here.

x = 1
plus_five(x)
print(x)  # >>> 1

# Standard solution: rewrite our code in a way our function
# calculates a new value and then we just reassign it to variables
# whose values we need to change.

def get_plus_five(x):
    return x + 5

x = 1
x = get_plus_five(x)
print(x)  # >>> 6

What if we have many objects of the same value and want them to have common state?

a = 1
b = a
c = b
# ...

a = get_plus_five(a)
# What about b, c and other links
# at different places of our project?

Usage

We can use smart wrappers for that purpose:

from smartwrappers import wrap

a = wrap(1)  # or explicitly a = SmartWrapper(1)
b = a
c = b

print(a())  # >>> 1
print(b())  # >>> 1
print(c())  # >>> 1

a(5)
print(a())  # >>> 5
print(b())  # >>> 5
print(c())  # >>> 5

def plus_five(x):
    x(x() + 5)

plus_five(a)
print(a())  # >>> 10
print(b())  # >>> 10
print(c())  # >>> 10

Matrices

We can use smart wrappers for wrapping lists:

from smartwrappers import wrap_list

a = wrap_list([1, 2, 3])
b = [a[0], a[1], a[2]]
print(a)  # >>> [1, 2, 3]
print(b)  # >>> [1, 2, 3]

a[1] = 'a'
print(a)  # >>> [1, 'a', 3]
print(b)  # >>> [1, 'a', 3] => wrappers behave like references to mutable content.

We can wrap lists with any levels of dimensions:

a = wrap_list([[1, 2], [3, 4]], dimensions=2)
b = [[a[0][0], a[1][0]], [a[0][1], a[1][1]]]  # Transposed matrix.

#  a is:
#        1 2
#        3 4
#  b is transposed matrix a:
#        1 3
#        2 4

a[0][1](0)

#  a is:
#        1 0
#        3 4
#  b keeps changes:
#        1 3
#        0 4

If we don't want to put inside our wrapper values of different types we can use StrictSmartWrapper:

from smartwrappers import wrap_strictly

a = wrap_strictly('hello', str)
a('world')  # OK.
a(5)  # Error.
b = wrap_strictly('hello', int)  # Error.

Project details


Download files

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

Files for smartwrappers, version 0.0.5
Filename, size File type Python version Upload date Hashes
Filename, size smartwrappers-0.0.5-py3-none-any.whl (5.1 kB) File type Wheel Python version py3 Upload date Hashes View
Filename, size smartwrappers-0.0.5.tar.gz (3.9 kB) File type Source Python version None Upload date Hashes View

Supported by

AWS AWS Cloud computing Datadog Datadog Monitoring DigiCert DigiCert EV certificate Facebook / Instagram Facebook / Instagram PSF Sponsor Fastly Fastly CDN Google Google Object Storage and Download Analytics Pingdom Pingdom Monitoring Salesforce Salesforce PSF Sponsor Sentry Sentry Error logging StatusPage StatusPage Status page