有没有办法解决ContextDecorator中的__enter__ AttributeError?

Is there a way to solve __enter__ AttributeError in ContextDecorator?

我正在尝试创建一个 ContextDecorator。这是我的代码:

class CmTag(ContextDecorator):

    def __init__(self, cm_tag_func):
        self.cm_tag_func = cm_tag_func
        
    def __enter__(self):        
        return self

    def __exit__(self, exc_type, exc_value, tb):
        if exc_type is not None:
            traceback.print_exception(exc_type, exc_value, tb)
        else:
            name = self.cm_tag_func.__name__
            print(name)

    def __call__(self, **kwargs):

        name = self.cm_tag_func.__name__
        print(name)
        print(kwargs)
        self.cm_tag_func(**kwargs)

@CmTag
def testing(**kwargs):
    pass

with testing(foo='bar') as t:
    print('a test')

我希望输出为:

testing
{'foo':'bar'}
a test
testing

即先打印函数名。然后它将 kwargs 作为字典打印出来。 然后它打印出上下文管理器中的任何内容,在本例中为 'a test'。最后在退出时,它再次打印出函数的名称。

相反,它表示:

testing
{'foo': 'bar'}
Traceback (most recent call last):
  File "/workspace/sierra/src/sierra/test.py", line 32, in <module>
    with testing(foo='bar') as t:
AttributeError: __enter__

我看到其他解决方案说 __enter__ 未定义。但是我在这里做到了。

我该如何纠正这个问题?谢谢。

在行

with testing(foo='bar') as t:
    print('a test')

由于 testingCmTag 的对象,您执行对 __call__ 的调用,但是,您在该方法中 return None 而不是returning self。 在该方法的末尾添加 return self 将修复它。