上下文管理器仅用于引发异常吗?

时间:2019-06-10 17:53:11

标签: python python-3.x

在python中使用上下文管理器仅用于验证某些数据并处理异常以使代码更整洁是好还是坏的做法?

这是我的意思:

@contextmanager
def validate_data(a, b):
  if a != b:
    raise ValidationError("Wrong values")
  if a ==- 1:
    raise ValidationError("You can't use -1")
  if a ==- 2:
    raise ValidationError("You can't use -2")
  # etc validations
  yield

if __name__ == '__main__':
  a = 1
  b = 2
  with validate_data(a, b):
    print(a + b)

问题在于,我在Python中发现的有关上下文管理器的几乎所有信息都与处理连接或读取文件操作有关。

我可以使用上下文管理器来进行像这样的简单操作吗?

对于我来说,这看起来是一个很好的责任分离示例,验证与功能主体是分离的,您可以专注于功能的作用,而不必阅读所有验证行。

1 个答案:

答案 0 :(得分:2)

在这种情况下,仅返回True(对于有效数据)或False(对于无效数据)和if语句的函数将更加清晰。

def is_valid_data(a, b):
    if a != b:
        return False
    ...
    return True

if is_valid_data(a, b):
    print(a + b)

上下文管理器主要用于确保在with语句的主体之后 处运行某些内容,无论该主体在执行过程中是否引发任何异常。它原本是为像这样的模式提供更简单的替代方法

# 1) Initialize some stuff
try:
    # 2) Do something with the stuff
finally:
    # 3) Do stuff whether or not the above

上下文管理器封装了步骤1和3:

with context_manager as cm:
    # Do something

with语句确保cm.__enter__在正文之前运行,并确保cm.__exit__运行,即使异常会阻止with的整个正文语句(或其后的任何内容)开始运行。