gpt4 book ai didi

python - 每次我在 python 中调用函数时,有没有办法进行一些预处理/后处理

转载 作者:行者123 更新时间:2023-12-02 18:18:07 25 4
gpt4 key购买 nike

我需要对从包(包是共享对象文件)导入的函数进行多次调用。但是,每次我从这个包中调用函数时,我都需要执行一些预处理/后处理步骤。像这样的事情:

import xyz

prepare()
xyz.foo(<args>)
done()

prepare()
xyz.bar(<args>)
done()

prepare()
xyz.foobar()
done()

有什么方法可以让 python 在调用 xyz 模块中的函数之前始终调用 prepare() 吗?并在调用完成后调用 done() ?在我的整个代码中编写 preparedone 看起来多余且困惑。感谢您的帮助!

最佳答案

这通常是通过上下文管理器完成的。

import contextlib

@contextlib.contextmanager
def with_preparation():
prepare()
yield
done()

with preparation():
xyz.foo(<args>)

with preparation():
xyz.bar(<args>)

with preparation():
xyz.foobar()

preparation定义一个返回上下文管理器的函数。 with语句通过调用上下文管理器的 __enter__ 来工作。方法,然后执行主体,然后确保上下文管理器的 __exit__方法在继续之前调用(无论是由于引发异常还是主体正常完成)。

contextlib.contextmanager提供了一种使用生成器函数定义上下文管理器的简单方法,而不是让您使用显式 __enter__ 定义类。和__exit__方法。


您提到特定模块中的每个功能都需要它。如果没有有关该模块的确切详细信息,这可能不完全正确,但您也许可以在此基础上进行构建。

class XYZWrapper:
def __getattr__(self, name):
# Intentionally let an AttributeError propagate upwards
f = getattr(xyz, name)
def _(self, *args, **kwargs):
prepare()
return f(*args, **kwargs)
done()
setattr(XYZWrapper, name, _)
return _

prepared = XYZWrapper()

prepared.foo(<args>)
prepared.bar(<args>)
prepared.foobar()


简而言之,XYZWrapper上的任何属性访问实例尝试在 xyz 上查找相同的属性模块,如果成功,定义一个调用 prepare() 的包装器和done()根据需要并修补 XYZWrapper使用新包装器的实例。

关于python - 每次我在 python 中调用函数时,有没有办法进行一些预处理/后处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71268881/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com