When the days get colder and the nights longer, then evil things are hatched.
A can is like a pickle, in that it is a string, but anything can be canned. Unlike a pickle, a can cannot leave the process, though, unless the object it points to lives in shared memory. Here is the output of a test session: <test output start> > python -i cantest.py dir(Can) yields: ['__doc__', '__file__', '__name__', 'can', 'uncan'] Testing string object s is: The quick brown fox jumps over the lazy dog id(s) is: 47794404772392 ps = can(s) : 47794404772392 t = uncan(ps): The quick brown fox jumps over the lazy dog t is s gives: True Testing q = Queue.Queue() q is: <Queue.Queue instance at 0x2b780085e830> id(q) is: 47794404845616 pq = can(q) : 47794404845616 r = uncan(pq): <Queue.Queue instance at 0x2b780085e830> r is q gives: True Testing banana class object b = banana() <__main__.banana object at 0x73d190> id(b) is: 7590288 pb = can(c) : 7590288 c = uncan(pb): <__main__.banana object at 0x73d190> c is b gives: True That's it, folks! >>> pcan = can(Can.can) >>> pcan '47794404843816' >>> griz = uncan(pcan) >>> griz is can True >>> z = 'foo' >>> griz(z) '7557840' >>> uncan(_) 'foo' >>> griz <built-in function can> >>> # uncanny! >>> <end of test output> Now I have only tested it on my system, which is 64 bit SuSe Linux. I suspect it is fragile. I know it is dangerous - if you uncan a random number, then if you are lucky, you will get a segfault. If you are not lucky, your life will be completely changed. If you have any interest, contact me and I will send you the source. - Hendrik -- http://mail.python.org/mailman/listinfo/python-list