为了能够pickle嵌套函数(用于多处理),我用decorator修饰了嵌套函数:
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'
为了使decorator工作,我只需要将wrapper_one
的__qualname__
更改为globalize_one
行前面的setattr(modules['__main__'],'sdfsdf',wrapper_one)
中的sdfsdf
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
进行pickle处理
我的困惑是,为什么通过更改__qualname__
,装饰器将正常工作?我认为更改函数名没有实际效果
目前没有回答
相关问题 更多 >
编程相关推荐