首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从Python的其他作用域访问“`with`”上下文?

如何从Python的其他作用域访问“`with`”上下文?
EN

Stack Overflow用户
提问于 2020-01-15 13:29:13
回答 1查看 69关注 0票数 1

我有一个这样的with-statement:

代码语言:javascript
复制
from tqdm import tqdm

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

process()是另一个函数,在该函数中,我希望将日志记录设置为上下文中是否存在tqdm实例(从上面的代码中调用)(从其他地方调用)。在伪码中,例如:

代码语言:javascript
复制
def process(document):
     if <tqdm in context>:
       progress_bar.write("processing")
     else:
       logging.info("processing")

我能否从父作用域中动态地查找和访问with-context (在本例中由tqdm提供)?多么?

contextlib documentation不提供访问with-context的(直截了当的)方式。

到目前为止,我找到的解决方法是将progress_bar对象作为可选参数传递给process(),并在可用时使用它。但是,仅为此目的更改函数似乎是多余的。

一般情况下,或者tqdm是否提供了一种处理这个问题的模式?

背景的更新

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

如果调用堆栈中的叶函数无法从根函数访问with-context,则需要将progress_bar对象向下传递到调用树的所有级别。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-17 09:01:23

总结评论意见:

  • 没有办法在另一个函数中隐式地访问with-context (而且不应该有)。
  • 最好和最干净的解决方案是显式传递用于写入的对象。对于给定的用例,可以/应该使用以下默认值:

代码语言:javascript
复制
def process(document, writer: Callable[[str], Any] = logging.info):
    writer("processing")    
    [...]

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

代码语言:javascript
复制
from tqdm import tqdm

with tqdm(documents) as progress_bar:
    for document in documents:
        if [...]:
            process(document, writer=progress_bar.write)
            progress_bar.update()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59752441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档