Skip to content

MitalAshok/objecttools

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

24 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

objecttools

Various tools for working with objects and classes in Python

Cached properties

Works just like a normal property, but returned values are cached:

from objecttools import CachedProperty

class ExpensiveOperations(object):
    @CachedProperty
    def expensive_attribute(self):
        return self.calculate()
    
    # To make it settable
    
    @expensive_attribute.setter
    def expensive_attribute(self, value):
        pass
    
    # To make it deletable
    
    @expensive_attribute.deleter
    def expensive_attribute(self):
        pass

e = ExpensiveOperations()
e.other_attribute = 1
print(e.expensive_attribute)  # Takes a long time.
print(e.expensive_attribute)  # Very quick; just retrieve from cache
v = e.expensive_attribute

e.other_attribute = 2  # expensive_attribute should be different now!
print(e.expensive_attribute)  # Old value that is wrong.
del e.expensive_attribute
print(e.expensive_attribute)  # Takes a long time, but returns new value.
e.other_attribute = 1
# Reset to known value
e.expensive_attribute = v
print(e.expensive_attribute)  # Correct value!

Singletons

from objecttools import Singleton

Sentinel = Singleton.create('Sentinel')

Sentinel() is Sentinel()  # True

d.get('missing_value', Sentinel()) is Sentinel()  # True

class GlobalState(dict, metaclass=Singleton):
    attr = 0


gs = GlobalState()
gs['value'] = 7
gs.attr = 1

print(GlobalState()['value'] + GlobalState().attr)  # 8

For Python 2 and 3 compatibility, use it as a decorator:

@Singleton.as_decorator
class Class(object):
    pass

ObjectProxy

Create a weak-referenceable proxy to an object that supports the same operations:

from objecttools import ObjectProxy
 
ls = [1, 2, 3]
proxy = ObjectProxy(ls)
 
proxy.append(4)
proxy += [5, 6]
proxy[2:4] = [7, 8, 9]
print(ls)  # [1, 2, 7, 8, 9, 5, 6]

serializable

Create serializable forms of objects (For pickling)

from objecttools import SerializableFunction, SerializableConstant
import pickle
 
file = open('file.txt', 'w')
 
f = lambda file, a: file.write(a)
 
try:
    # Cannot pickle files, even though it is a global constant
    gile = pickle.loads(pickle.dumps(file))
except TypeError:
    gile = pickle.loads(pickle.dumps(SerializableConstant('file', __name__))).value
 
try:
    # Cannot pickle functions if they are lambdas
    # Or are inner functions
    # Or are deleted after creation
    # Or are methods
    g = pickle.loads(pickle.dumps(f))
except pickle.PicklingError:
    g = pickle.loads(pickle.dumps(SerializableFunction(f)))
 
g(gile, 'data')  # Works

Installing

From PyPI

$ pip install objecttools

From source

$ git clone 'https://github.com/MitalAshok/objecttools.git'
$ python ./objecttools/setup.py install

About

Various tools for working with objects and classes in Python

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages