[Twisted-Python] Question about Foolscap Slicers and Unslicers.
kgi
iacovou at gmail.com
Fri Feb 9 13:05:29 EST 2007
Hi all (and Brian in particular);
I've got a few questions about Foolscap Slicers and Unslicers. The
documentation I'm reading is at:
http://twistedmatrix.com/~warner/Foolscap/using-pb.html
In it, a code fragment of custom slicing is given:
class ListSlicer(BaseSlicer):
opentype = ("list",)
slices = list
The docs then say in the next paragraph:
"""
Slicer registration can be either explicit or implicit. In this example, an
implicit registration is used: by setting the slices attribute to the list
type, the BaseSlicer's metaclass automatically registers the mapping from
list to ListSlicer.
To explicitly register a slicer, just leave opentype set to None (to disable
auto-registration), and then register the slicer manually.
"""
... and then quote an example of this:
class TupleSlicer(BaseSlicer):
opentype = ("tuple",)
slices = None
...
registerAdapter(TupleSlicer, tuple, pb.ISlicer)
The problem is that the code sets *slices* to None, but the text talks about
setting *opentype* to None. I'd be inclined to think the code is right,
except the text says the same sort of thing happens later on when talking
about Unslicers:
"""
If the Unslicer has a non-None class attribute named opentype, then it is
automatically registered. If it does not have this attribute (or if it is set
to None), then no registration is performed, and the Unslicer must be
manually registered:
"""
Which is it?
Actually, my real question is: what are the exact uses of "opentype"
and "slices" respectively? I suspect that "slices" refers to the type being
sliced, and "opentype" is something low-level to do with the slicing process
(maybe the symbol inserted in the output stream?). Why is is (seemingly
always) a 1-tuple?
Lastly (secondly?) there is some text in the document:
http://twistedmatrix.com/~warner/Foolscap/specifications/pb.html
under the paragraph heading, "Arbitrary Instances are NOT serialized" that
says:
"""
Both ends must be willing to transport the object. The sending side expresses
this by marking the class (subclassing Copyable, or registering an ISlicer
adapter).
"""
To me this appears to imply that each of the various ways of transporting a
non-fundamental type is as good as any other: if I have a subclassed Copyable
then I wouldn't need an ISlicer adapter, and vice versa.
Is this true? Does this mutual relationship hold true for ISlicer-registered
types and types making use of foolscap.registerRemoteCopyFactory()? I'm
asking because I have some types for which I have called
registerRemoteCopyFactory() yet for which I get an exception saying that the
object is not sliceable (implying that I need to take the ISlicer approach
and that the registerRemoteCopyFactory() approach is no longer good enough).
I'm using Python 2.4, Twisted 2.5.0 and head-of-SVN Foolscap.
Cheers,
Ricky
More information about the Twisted-Python
mailing list