python - 如何处理条件导入相关的异常?

标签 python

我想知道处理依赖于条件导入的异常的最优雅的方法是什么。 例如:

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或者直接返回TrueFalse取决于用户检查是否成功。

关于python - 如何处理条件导入相关的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2325345/

相关文章:

python - matplotlib 安装问题 python 3

Python 发布 osx 通知

python - python中使用 "\"将字符串转换为元组

python - GEKKO - 作为问题约束的变量列的指示变量

python - 如何高效地将查询结果展开到字典中

python - 如何进行针对单个列表构建的合并排序,而不是对 "list of list"进行排序?

python - Pip 不工作 - ModuleNotFoundError : No module named 'runpy'

Python 列表错误

python - 使用 scikit-learn PCA 找到具有最高方差的维度

python - 使用 pandas 或 python 替换为重复列的第一次出现值