在python中,当函数的_qualname___)发生更改时会发生什么情况?

2024-06-16 11:23:10 发布

您现在位置:Python中文网/ 问答频道 /正文

为了能够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__,装饰器将正常工作?我认为更改函数名没有实际效果


Tags: 函数modulesreturndefargswrapperonepickle