为了能够pickle嵌套函数(用于多重处理),我用装饰器装饰了嵌套函数:
def globalize_one(func):
def wrapper_one(*args,**kwargs):
return func(*args,**kwargs)
setattr(modules['__main__'],'sdfsdf',wrapper_one)
return wrapper_one
然而,当我运行这个装饰器时,这个装饰器不起作用
def test_one():
@globalize_one
def inside_one():
return 1
try:
pickle.dumps(inside_one)
except Exception as e:
print(e)
test_one()
我收到了异常Can't pickle local object 'globalize_one.<locals>.wrapper_one'
为了让装饰器工作,我需要做的就是改变__qualname__
of wrapper_one
to sdfsdf
in globalize_one
就在该行之前setattr(modules['__main__'],'sdfsdf',wrapper_one)
.
def globalize_two(func):
def wrapper_two(*args,**kwargs):
return func(*args,**kwargs)
# the single extra line as compared to globalize_one
wrapper_two.__qualname__ = 'sdfsdf'
setattr(modules['__main__'],'sdfsdf',wrapper_two)
return wrapper_two
def test_two():
@globalize_two
def inside_two():
return 1
try:
pickle.dumps(inside_two)
except Exception as e:
print(e)
通过运行代码可以看到,嵌套函数inside_two
现在可以腌制了。
我的困惑是,为什么要改变__qualname__
,装饰器会正常工作吗?我认为更改函数名称没有实际效果。