在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中发现的有关上下文管理器的几乎所有信息都与处理连接或读取文件操作有关。
我可以使用上下文管理器来进行像这样的简单操作吗?
对于我来说,这看起来是一个很好的责任分离示例,验证与功能主体是分离的,您可以专注于功能的作用,而不必阅读所有验证行。
答案 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
的整个正文语句(或其后的任何内容)开始运行。