python 是否有一种方法可以检测正在运行的代码是否在上下文管理器中执行?

bzzcjhmw  于 2022-12-10  发布在  Python
关注(0)|答案(1)|浏览(106)

正如标题所述,有没有办法做到这样的事情:

def call_back():
    if called inside context:
        print("running in context")
    else:
        print("called outside context")

这将导致:

with CTM() as context:
    call_back()
call_back()

>>> "running in context"
>>> "called outside context"
eivnm1vs

eivnm1vs1#

正如@chepner在问题的评论中所写的
我认为不使用inspect模块是不可能的。with语句中的代码块没有什么特别之处,除了保证context.__enter__在执行之前被调用,context.__exit__在执行之后被调用。
然后@larsks建议如果你有控制上下文管理器...
...您可以更新某些全局或对象特定的状态,以指示您是否在上下文管理器中。
这似乎是@new-dev-123最终采用的解决方案。
这里有一个解决方案:
第一个
如果您希望多个方法具有相同的行为,或者保持职责分离,则可以使用装饰器。

def reveal_context(func):
    def inner(self, *args, **kwargs):
        if self._is_in_context:
            print("running in context")
        else:
            print("called outside context") 
        return func(self, *args, **kwargs)
    return inner
    
class CTM:
    def __init__(self):
        self._is_in_context = False
    def __enter__(self):
        self._is_in_context = True
        return self
    def __exit__(self, *args, **kwargs):
        self._is_in_context = False
    @reveal_context
    def call_back(self):
        pass

相关问题