首页 > 解决方案 > 上下文管理器是否仅用于引发异常?

问题描述

在 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 中找到的关于上下文管理器的所有信息都是关于处理连接或读取文件操作的。

我可以将上下文管理器用于像这样的简单操作吗?

对我来说,这看起来像是分离职责的一个很好的例子,验证与函数体分离,你可以专注于函数的作用,而不是阅读所有这些验证行。

标签: pythonpython-3.x

解决方案


在这种情况下,一个简单地返回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语句主体(或它之后的任何内容)运行。


推荐阅读