相关疑难解决方法(0)

是否可以访问封闭的上下文管理器?

使用with语句基本上有三种方法:

使用现有的上下文管理器:

with manager:
    pass
Run Code Online (Sandbox Code Playgroud)

创建上下文管理器并将其结果绑定到变量:

with Manager() as result:
    pass
Run Code Online (Sandbox Code Playgroud)

创建上下文管理器并丢弃其返回值:

with Manager():
    pass
Run Code Online (Sandbox Code Playgroud)

如果我们get_manager()在上面的三个块中放置了一个函数,是否有任何实现可以返回封闭的上下文管理器,或者至少它们的__exit__函数?

在第一种情况下,这显然很容易,但我想不出能让它在另外两种情况下工作的方法.我怀疑是否可以获得整个上下文管理器,因为值堆栈会在SETUP_WITH操作码之后立即弹出.但是,由于__exit__函数存储在块堆栈中SETUP_WITH,是否有某种方法可以访问它?

python contextmanager

15
推荐指数
2
解决办法
3072
查看次数

如何在单独的线程中的上下文管理器下运行代码?

我想要一个上下文管理器,我可以在其中放置一些要在单独的线程中执行的代码。

到目前为止,我找不到一种方法来实现我想要的,最好的选择是编写闭包并在单独的线程中执行闭包。

我想要这样的东西

# code runs on main thread
print("this is main thread")

with amazingcontextmanager:
    # code to run in separate thread
    print("this is not main thread")

Run Code Online (Sandbox Code Playgroud)

编辑:让我尝试再次问我的问题

@contextlib.contextmanager
def amazingcontextmanager():
    try:
        yield
    finally:
        print("thread done")
Run Code Online (Sandbox Code Playgroud)

我想yield在新线程中执行。基本上我放在 contextmanager 下的任何内容都应该在单独的线程中执行。

python multithreading python-multithreading python-3.x

8
推荐指数
1
解决办法
700
查看次数

上下文管理器可以在 Python 中多次运行包含的块吗?

作为一个基本示例,请想象以下内容:

with runFiveTimes:
    print("test")
Run Code Online (Sandbox Code Playgroud)

这在Python中可能吗?

(这个例子只是为了澄清问题,显然有更简单的方法来实现这个特定的例子)

python contextmanager

2
推荐指数
1
解决办法
1578
查看次数