Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于类的上下文管理器与基于生成器的上下文管理器_Python - Fatal编程技术网

Python 基于类的上下文管理器与基于生成器的上下文管理器

Python 基于类的上下文管理器与基于生成器的上下文管理器,python,Python,我们可以使用一个Indenter()类来设置如下的文本缩进级别: hi! hello bonjour 上下文管理器的基于类的实现是: class Indenter: def __init__(self): self.level = 0 def __enter__(self): self.level += 1 return self def __exit__(self, e

我们可以使用一个
Indenter()
类来设置如下的文本缩进级别:

    hi!
        hello
            bonjour
上下文管理器的基于类的实现是:

class Indenter:
    def __init__(self):
        self.level = 0

    def __enter__(self):
        self.level += 1
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.level -= 1

    def print(self, text):
        print('    ' * self.level + text)


with Indenter() as indent:
    indent.print('hi')
    with indent:
        indent.print('hello!')
        with indent:
            indent.print('bonjour')
我想知道是否可以在基于生成器的上下文管理器中实现相同的解决方案?我尝试的解决方案不起作用,可能是因为我没有掌握上下文管理器的概念

更新: 这是我在板上使用打印函数的方法,因此上下文产生了这个函数。它更好,但仍然只适用于单个缩进:

from contextlib import contextmanager

@contextmanager
def indenter():
    level = 0
    def prints(text):
        print('____' * level + text)
    try:
        level += 1
        yield prints
    finally:
        level -= 1

with indenter() as ind:
    ind('aaaa')
    with ind:
        ind('bbbbb')

____aaaa
---------------------------------------------------------------------------
AttributeError     Traceback (most recent call last)
     29 with indenter() as ind:
     30     ind('aaaa')
---> 31     with ind:
     32         ind('bbbbb')

AttributeError: __enter__

我想到了这个。它可以以与类版本类似的方式使用(但不完全相同)

输出:

____aaa
________bbb
____________ccc

你忘了打印了,谢谢!使用打印更新解决方案。但仍然不能像预期的那样工作:只打印一级缩进。我重新添加了导入。请始终在代码中包含导入。必须手工编写或更糟的是,搜索互联网以找出某个名字的所在地,这需要花费时间,最好是花在实际帮助你上。我写了与上面完全相同的代码(保存一些名字),但我不知道下一步该怎么办。你可以自由地接受你自己的答案,但老实说,我不认为这是你问这个问题时想要的。在这一点上,我相信一个合适的解决方案(如果可能的话)将过于复杂,没有任何实际用途,但它仍然是一个有趣的练习。实际上,我发现我的解决方案并不完全正确,因为与原始类示例不同,这里的缩进不依赖于上下文输入,而是依赖于我手动传递的级别值…:(是的,我认为这是锻炼。如果你不介意的话,我也想看看你的解决方案。
____aaa
________bbb
____________ccc