Various tools for working with objects and classes in Python
Project description
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__)))
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
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
objecttools-1.0.0.zip
(16.4 kB
view details)
File details
Details for the file objecttools-1.0.0.zip
.
File metadata
- Download URL: objecttools-1.0.0.zip
- Upload date:
- Size: 16.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | b8c35c6e647feef01271b9b4beb28fd50ca8ca12998869270ffa6a815e3071c8 |
|
MD5 | f626484feffa70eb9c1e04a8c1db3db9 |
|
BLAKE2b-256 | 2221ce1e7e8dfd76e8820097d6044342cd9c3839973b34940704e5d8c3ce6804 |