有没有办法解决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')
由于 testing
是 CmTag
的对象,您执行对 __call__
的调用,但是,您在该方法中 return None
而不是returning self
。
在该方法的末尾添加 return self
将修复它。
我正在尝试创建一个 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')
由于 testing
是 CmTag
的对象,您执行对 __call__
的调用,但是,您在该方法中 return None
而不是returning self
。
在该方法的末尾添加 return self
将修复它。