Tar*_*xus 6 python decorator pickle partial
我正在尝试使用部分函数创建一个可选择的装饰器.但是,在尝试这样做时,我一直遇到酸洗错误.
第一个天真的例子如下:
def decorator(func):
def wrapper(**kwargs):
return partial(func, **kwargs)
return wrapper
@decorator
def decorated(x, y=1, z=2):
return x+y+z
y5 = decorated(y=5)
pickle.dumps(y5)
Run Code Online (Sandbox Code Playgroud)
从何partial而来functools.
一点不天真的尝试涉及@wraps在上面添加一行def wrapper.这没有用.
我不确定我是否理解酸洗是如何起作用的.
问题在于你的装饰者,而不是局部的.一个局部的对象应该咸菜就好了:
>>> from pickle import *
>>> from functools import *
>>> f = partial(pow, 2)
>>> p = dumps(f)
>>> g = loads(p)
>>> g(5)
32
Run Code Online (Sandbox Code Playgroud)
所以,你的代码的这个问题在装饰器中.它不保留原始函数的名称.试试这个:
import pickle
from functools import *
def decorator(func):
def wrapper(**kwargs):
return partial(func, **kwargs)
return wrapper
def decorated(x, y=1, z=2):
return x+y+z
dd = decorator(decorated)
y5 = dd(y=5)
pickle.dumps(y5)
Run Code Online (Sandbox Code Playgroud)
要使用的修改dd应该允许pickle逻辑通过其名称发现底层函数.这就是泡菜的工作原理.
要查看pickle中的函数名称,请查看dumps输出:
>>> print pickle.dumps(y5)
cfunctools
partial
p0
(c__main__
decorated
p1
tp2
Rp3
(g1
(t(dp4
S'y'
p5
I5
sNtp6
b.
Run Code Online (Sandbox Code Playgroud)
"装饰"这个词需要是可以找到的,等于底层函数,而不是被装饰者隐藏.请记住,当函数被腌制时,只会存储它们的名称.该函数的实际内容不在pickle中.
有一些解决方法,但它们并不漂亮.您可以使用__setstate __()来保存函数名称及其源代码.然后添加 __getstate __()方法以通过执行其源来恢复该函数.
或者,您可以在函数对象对象中提取字节代码并保存它们.在还原时,编译代码对象并执行它.
简而言之,您使用带@符号的装饰器的目标与功能酸洗的工作方式直接相关.为了实现您的目标,您必须自定义功能酸洗,以保存功能,而不仅仅是名称.
| 归档时间: |
|
| 查看次数: |
3335 次 |
| 最近记录: |