gpt4 book ai didi

python - 如何从Python中的其他作用域访问 `with` -context?

转载 作者:行者123 更新时间:2023-12-01 06:34:16 25 4
gpt4 key购买 nike

我有一个with -这样的声明:

from tqdm import tqdm

with tqdm(documents) as progress_bar:
for document in documents:
if [...]:
process(document)
progress_bar.update()

process()是另一个函数,我想在其中限制日志记录是否有 tqdm上下文中的实例(从上面的代码调用)或不在上下文中(从其他地方调用)。在伪代码中,例如:

def process(document):
if <tqdm in context>:
progress_bar.write("processing")
else:
logging.info("processing")

我可以动态查找并访问 with -context(在本例中由 tqdm 提供)来自父作用域?怎么办?

contextlib documentation不提供访问 with 的(直接)方法-上下文。

到目前为止我找到的解决方法是传递 progress_bar对象作为 process() 的可选参数,并使用它(如果可用)。然而,仅仅为了这个目的而改变函数似乎是多余的。

Python 是通用的还是 tqdm具体来说,提供一个处理这个问题的模式?

背景更新:

这里的用例是,在现实世界的代码中,我有一个函数调用的串联。 process()事实上更复杂并调用各种其他函数。这些可能会记录输出,应该转到 progress_bar.write()如果有的话。

如果调用栈中的叶子函数无法访问with -来自根函数的上下文,我需要传递 progress_bar对象向下遍历调用树中的所有级别。

最佳答案

总结评论:

  • 无法在另一个函数中隐式访问 with 上下文(也不应该如此)。

  • 最好、最干净的解决方案是显式传递用于写入的对象。对于给定的用例,您可以/应该使用如下默认值:

def process(document, writer: Callable[[str], Any] = logging.info):
writer("processing")
[...]

为了写入 tqdm 实例而不是记录器,您可以像这样调用 process():

from tqdm import tqdm

with tqdm(documents) as progress_bar:
for document in documents:
if [...]:
process(document, writer=progress_bar.write)
progress_bar.update()

关于python - 如何从Python中的其他作用域访问 `with` -context?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59752441/

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