Best way to pickle functions

Dave Angel davea at dejaviewphoto.com
Fri Apr 3 14:52:54 EDT 2009


Aaron Scott wrote:
>> Pickling the source code is much sturdier.  It's very unlikely that
>> the same code runs differently in different interpreters.  It's much
>> more likely that the same code runs the same, or not at all.
>>     
>
> Okay, I've run into another problem. I've saved the code to a string,
> so I can call it up when I need it. I want to keep these functions all
> together, though, so I'm pushing them into a dictionary when I execute
> it. It seems like when I put it in a dictionary, though, it messes up
> the scope of the functions contained within. For example:
>
> 	import cPickle
> 	def Main():
> 		holder =}
> 		functiontest =def PickleTest():\n\tprint cPickle"
> 		exec functiontest in holder
> 		print holder["PickleTest"]()
> 	Main()
>
> ... produces:
>
> 	Traceback (most recent call last):
> 	  File "pickletest.py", line 11, in <module>
> 		Main()
> 	  File "pickletest.py", line 9, in Main
> 		print holder["PickleTest"]()
> 	  File "<string>", line 2, in PickleTest
> 	NameError: global name 'cPickle' is not defined
>
> Is there any way to do this so that the functions have access to the
> higher scope?
>
> Thanks.
>
>   
Why not use import ?  Simply recreate the source file, if necessary, and 
import it again.

If you must import without it being in a clear text file, check out the 
deprecated imputil module, standard in 2.x, but removed in Python 3.0.  
And if you find some way to get __import__ or one of its relatives to 
work from a stream instead of a file, please let us know.





More information about the Python-list mailing list