在现代Python中,您可以对函数和许多变量进行pickle处理。考虑以下内容:
import pickle, time
def foobar(a,b):
print("%r %r"%(a,b))
你可以将其进行序列化处理
p = pickle.dumps(foobar)
q = pickle.loads(p)
q(2,3)
你可以使用 pickle 序列化闭包
import functools
foobar_closed = functools.partial(foobar,'locked')
p = pickle.dumps(foobar_closed)
q = pickle.loads(p)
q(2)
即使闭包使用局部变量。
def closer():
z = time.time()
return functools.partial(foobar,z)
p = pickle.dumps(closer())
q = pickle.loads(p)
q(2)
但如果使用内部函数关闭它,将会失败。
def builder():
z = 'internal'
def mypartial(b):
return foobar(z,b)
return mypartial
p = pickle.dumps(builder())
q = pickle.loads(p)
q(2)
带有错误
pickle.PicklingError:无法对 <function mypartial at 0x7f3b6c885a50> 进行序列化:它没有被发现为 __ main __.mypartial
在 Python 2.7 和 3.6 中测试通过。