如何以 python 版本不可知的方式检查 http 状态代码?

How to check http status code in python version agnostic way?

我正在编写 python 代码,应该 运行 python 2.7 和 3.3+

我正在尝试找到一种方法来正确检查 http 状态代码并且不会降低我的测试覆盖率 %。

如果我这样写:

try:
    import http.client as httpclient
except ImportError:
    import urllib as httpclient

覆盖率永远不会是 100%

所以我的问题是:有更好的方法吗?

针对 Python 的多个版本时,您很少能达到 100% 的测试覆盖率。 Python 2 解释器将遵循一条执行路径,Python 3 解释器将遵循另一条执行路径,并且两个解释器都不会命中每一行代码。最好的解决方案是按照 Martijn 提到的那样做并使用 # pragma: no cover。以下是我在我的一个项目中解决这个问题的方法:

from sys import version_info
if version_info.major == 2:  # pragma: no cover
    from httplib import ACCEPTED, NO_CONTENT  # pylint:disable=import-error
else:  # pragma: no cover
    from http.client import ACCEPTED, NO_CONTENT  # pylint:disable=import-error

上面的解决方案将满足coverage、flake8和pylint:

  • 在每个条件的末尾放置 # pragma: no cover 注释可防止覆盖范围计算该行或后续块中的任何内容。
  • # pylint: 评论具有类似的目的。
  • 在每个评论前放置两个空格会让 flake8 样式检查器满意。

我从 SatelliteQE/nailgun nailgun/entities.py 中提取了上面的代码。