python - Python try: ing 不要重复代码。尝试:除了和其他
问题描述
我有这个:
try:
if session.var:
otherVar = session.var
else:
util = db.utility[1]
otherVar = session.var = util.freshOutTheBank
except AttributeError:
util = db.utility[1]
otherVar = session.var = util.freshOutTheBank
...do stuff with otherVar
情况是 session.var 可能不存在或可能为 None。用户在会话期间也会多次运行此代码。
如何避免重复代码。我基本上想做一个“除了和其他”,还是我看错了?
解决方案
session.var
如果它不存在,您可以通过首先检查它来避免使用,使用hasattr
. 这避免了对try
/except
块的需要。
if hasattr(session, 'var') and session.var is not None:
...
else:
...
另一种方法可能是让else
原始代码中的raise
except
try:
if session.var:
...
else:
raise AttributeError
except AttributeError:
...
在这种情况下,我认为“跳前检查”风格的编程(使用hasattr
)比通常更 Pythonic 风格的“更容易请求宽恕而不是许可”(它使用异常作为流程控制的一部分)更好。但任何一个都可以工作。
如果您的代码被划分为更小的函数,则可能更容易处理该问题。例如,如果您编写了一个get_session_var
函数,它可以return
从成功案例(在try
andif
块中),并且可以稍后解决两个错误案例:
def get_session_var(session):
try:
if session.var:
return session.var
except AttributeError:
pass
util = db.utility[1]
session.var = util.freshOutTheBank
return session.var
推荐阅读
- java - 场景:这个网页有一个包含 10 个网页链接的列表。单击每个 Web 链接并使用 selenium Java 在新窗口或选项卡中打开
- ruby-on-rails - 是否有针对我的情况使用 ActiveRecord#Pluck 的有效方法?
- .net-core - .net Core - 添加带有 JWT MVC 的 API 后,登录不再有效
- javascript - moment.js - 从星期日减去 1 天未按预期工作
- google-apps-script - GSuite Admin SDK > 目录 API:如何将值添加到用户的自定义架构?
- r - 在R中按一个列名合并数据集时如何删除重复的列名?
- if-statement - Excel formula has too many arguments
- r - 加权中位数 by_group()
- etl - SAP BODS - 从表比较中获取 PK 违规
- asp.net-core - 在 asp.net core 中加密 appsettings 和其他配置