我想知道处理依赖于条件导入的异常的最优雅的方法是什么。 例如:
import ldap
try:
...
l = ldap.open(...)
l.simple_bind_s(...)
...
except ldap.INVALID_CREDENTIALS, e:
pass
except ldap.SERVER_DOWN, e:
pass
在现实世界的场景中(让我想到这一点的场景),我们有一个带有“登录”页面的 Cherrypy 服务器。登录方法做了很多事情 - 其中之一就是身份验证。
但是,我可以使用 LDAP 以外的其他方式进行身份验证,在这种情况下我根本不想导入 ldap。
但是,如果我将“import ldap”语句设置为有条件的(例如,仅当配置文件中的 USE_LDAP 值为 True 时才会导入它),我也必须对“except”做一些处理。问题是:什么?
捕获通用异常,使用 if 语句检查我们是否使用 LDAP(即导入 ldap),然后使用 isinstance 检查异常类型是否正确(ldap.INVALID_CREDENTIALS)?
尝试将依赖 ldap 的代码集中在一处,并重新引发最终在登录方法中捕获的用户定义异常?
你认为最Pythonic的是什么?
最佳答案
您的程序中可能应该有一个配置选项,用于决定应使用哪种身份验证。应根据此选项完成导入。
如果你把所有ldap相关的认证功能都放到自己的模块中,比如auth_ldap
并对其他身份验证方法执行相同的操作,您可以像这样进行登录检查:
if config.auth_method == 'ldap':
import ldap_auth as auth
elif config.auth_method == 'db':
import db_auth as auth
else:
raise Exception("No valid authentication module configured")
auth.check_login(user, password)
check_login
每个模块中的方法将在这里提供一个统一的接口(interface),该接口(interface)在内部执行执行特定登录所需的任何操作。此函数还可以将特定的 Ldap 异常转换为通用的 LoginFailure
或者直接返回True
或False
取决于用户检查是否成功。
关于python - 如何处理条件导入相关的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2325345/