python - 上下文管理器是否仅用于引发异常?
问题描述
在 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 中找到的关于上下文管理器的所有信息都是关于处理连接或读取文件操作的。
我可以将上下文管理器用于像这样的简单操作吗?
对我来说,这看起来像是分离职责的一个很好的例子,验证与函数体分离,你可以专注于函数的作用,而不是阅读所有这些验证行。
解决方案
在这种情况下,一个简单地返回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
语句主体(或它之后的任何内容)运行。
推荐阅读
- sql - 查询以从另一个表中查找某些产品组
- html - server.arg("plain") 在 ESP8266 Webserver 中的某些情况下不起作用
- java - 如何在不指定子节点的情况下从 firebase 读取数据?
- ruby - 更改 ruby 版本后出现frozenobject错误
- c# - 我们可以使用 InnerText 将文本提取到第一个内部
(如果存在)吗? - javascript - Javascript多范围滑块值交叉更新
- angular - 减少错误类型参数管道变换角度
- verilog - 从 ROM 读取数据
- sql - 执行级联“if”或合并两个子查询过滤查询是否更快?
- api - 是否有任何 google workspace api 可以提供我在我的域上安装的应用程序列表以及它们的许可证详细信息?