python - 当函数的 __qualname__ 在 python 中更改时会发生什么?
问题描述
为了能够腌制嵌套函数(用于多处理),我用装饰器装饰了嵌套函数:
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
为sdfsdf
。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__
,装饰器会正常工作?我认为更改函数的名称没有实际效果。
解决方案
推荐阅读
- python - 如何为管道中的不同“步骤”找到最佳参数?
- awk - Compare two yaml file and get matching elements from first file based on key
- c# - 如何理解当前段落是图像(Word)
- android - 导航不再工作,错误:忽略 popBackStack 到目的地,因为在当前返回堆栈上找不到它
- c# - 无法配置 HTTPS 端点。未指定服务器证书,默认开发者证书找不到或已过期
- python - Discord.PY -
错误 - python - 执行按另一列的值分组的熊猫列的规范化
- recaptcha - 在同一页面上加载 Enterprise Recaptcha (invisble) 和 V2 Checkbox (non-enterprise) 会导致 V2 Checkbox 默认为 Enterprise
- foreach - VTL 脚本 - ForEach 循环遍历数组
- python - sqlalchemy merge() 使现有记录值为空