S-expression-based persistence of python objects.
I do something very much like Pickle; however, pickle's main goal seems to be
efficiency (both in space and time); jelly's main goals are security, human
readability, and portability to other environments.
This is how Jelly converts various objects to s-expressions:
Integer: 1 --> 1
List: [1, 2] --> [list , 1, 2]
String: "hello" --> "hello"
Float: 2.3 --> 2.3
Dictionary: {a : 1, b : 'c'} --> [dictionary , [b , 'c'], [a , 1]]
Module: UserString --> [module , 'UserString']
Class: UserString.UserString --> [class , [module , 'UserString'], 'UserString']
Function: string.join --> [function , join , [module , 'string']]
Instance: s is an instance of UserString.UserString, with a __dict__ {'data': 'hello'}:
["UserString.UserString", [dictionary , [data , 'hello']]]
# [instance , [class , [module , 'UserString'], 'UserString'], [dictionary , [data , 'hello']]]
Class Method: UserString.UserString.center:
[method , center , ['None'], [class , [module , 'UserString'], 'UserString']]
Instance Method: s.center, where s is an instance of UserString.UserString:
[method , center , [instance , [reference , 1, [class , [module , 'UserString'], 'UserString']], [dictionary , [data , 'd']]], [dereference , 1]]
Imported modules
|
|
import copy
import pickle
import string
import sys
from twisted.python.reflect import namedObject, namedModule
import types
from types import StringType, IntType, TupleType, ListType, DictType, LongType, FloatType, FunctionType, MethodType, ModuleType, DictionaryType, InstanceType, NoneType, ClassType
|
Functions
|
|
getInstanceState
jelly
setInstanceState
setUnjellyableForClass
setUnjellyableForClassTree
unjelly
|
|
getInstanceState
|
getInstanceState ( inst, jellier )
Utility method to default to normal state rules in serialization.
|
|
jelly
|
jelly (
object,
taster=DummySecurityOptions(),
persistentStore=None,
invoker=None,
)
Serialize to s-expression.
Returns a list which is the serialized representation of an object. An
optional taster argument takes a SecurityOptions and will mark any
insecure objects as unpersistable rather than serializing them.
|
|
setInstanceState
|
setInstanceState (
inst,
unjellier,
jellyList,
)
Utility method to default to normal state rules in unserialization.
|
|
setUnjellyableForClass
|
setUnjellyableForClass ( classname, unjellyable )
Set which local class will represent a remote type.
If you have written a Copyable class that you expect your client to be
receiving, write a local "copy" class to represent it, then call:
jellier.setUnjellyableForClass('module.package.Class', MyJellier).
Call this at the module level immediately after its class
definition. MyCopier should be a subclass of RemoteCopy.
The classname may be a special tag returned by
Copyable.getTypeToCopyFor rather than an actual classname.
This call is also for cached classes, since there will be no
overlap. The rules are the same.
|
|
setUnjellyableForClassTree
|
setUnjellyableForClassTree (
module,
baseClass,
prefix=None,
)
Set all classes in a module derived from baseClass as copiers for a corresponding remote class.
When you have a heirarchy of Copyable (or Cacheable) classes on
one side, and a mirror structure of Copied (or RemoteCache)
classes on the other, use this to setCopierForClass all your
Copieds for the Copyables.
Each copyTag (the "classname" argument to getTypeToCopyFor, and
what the Copyable's getTypeToCopyFor returns) is formed from
adding a prefix to the Copied's class name. The prefix defaults
to module.__name__. If you wish the copy tag to consist of solely
the classname, pass the empty string ''.
- module
- a module object from which to pull the Copied classes.
(passing sys.modules[__name__] might be useful)
- baseClass
- the base class from which all your Copied classes derive.
- prefix
- the string prefixed to classnames to form the unjellyableRegistry.
|
|
unjelly
|
unjelly (
sexp,
taster=DummySecurityOptions(),
persistentLoad=None,
invoker=None,
)
Unserialize from s-expression.
Takes an list that was the result from a call to jelly() and unserializes
an arbitrary object from it. The optional taster argument, an instance
of SecurityOptions, will cause an InsecureJelly exception to be raised if a
disallowed type, module, or class attempted to unserialize.
|
Classes
|
|
|
|