首先,如果要对版本进行数值比较,请使用version_info,不要尝试解析version中的字符串。*
这也意味着您可以利用元组的比较方式并编写如下代码:
if sys.version_info < (3, 3):
……如果 Python 到 3.10.0 或 4.0 出来,它也不会中断。
* 除非您需要担心 1.5 与 2.0,在这种情况下,您显然在 Usenet 和 StackOverflow 之间有一个时间机器网关,您当然可以想到更好的用途。
无论如何,最好先测试一下shlex.quote 是否存在。这样一来,读者就很清楚你在做什么:如果可能,使用shlex.quote,如果没有,则回退到pipes.quote。
你会在所有地方看到这种模式——甚至在 stdlib 中,如果可能的话,代码从 C 加速器模块导入,但如果不是,则使用备用代码(例如,如果你使用 PyPy 而不是 CPython) .
另外,请注意pipes.quote仅在 2.7 中记录。不是 3.0-3.2(这似乎是您关心的……),也不是 2.6,或任何其他版本。您依赖于在特定实现中碰巧存在的东西。 (嗯,实际上,在所有这些中,* 但是,如果你不需要,为什么要依赖它?)
* 据我所知,没有任何 3.2 实现具有 pipes 和 shlex 但没有 pipes.quote。未来可能不会有太多新的 3.2 实现。
此外,虽然它有时对函数中间的import 很有用,但这样做有点奇怪。如果在您部署它的机器上安装有问题,您是否真的希望能够成功导入您的模块,但随后在调用某些函数时得到ImportError?这就是人们一直困惑并跑向SO寻求帮助的那种事情。 :) (当您不需要时,在sys.modules 中查找所有这些并将字符串转换为整数等显然也会对性能造成一点影响,但我怀疑这会很重要。)
所以,我想我会这样写:
try:
from shlex import quote as cmd_quote
except ImportError:
from pipes import quote as cmd_quote