我的一个项目使用的shlex.quote自python 3.3起可用。但是该shlex.quote与移至shlex之后已弃用的pipes.quote相同。

现在为了兼容性,我使用以下代码:

def cmd_quote(string):
    import sys
    if int(sys.version[2]) < 3:
        import pipes
        return pipes.quote(string)
    else:
        import shlex
        return shlex.quote(string)

是否存在更好的做法?

最佳答案

首先,如果要对版本进行数值比较,请使用 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实现具有pipesshlex但没有pipes.quote。将来可能不会创建太多新的3.2实现。

同样,尽管偶尔在函数中间使用import很有用,但这是一件奇怪的事情。如果将其部署到的计算机上的安装存在问题,您是否真的希望能够成功导入模块,但是随后在调用某些函数时得到了ImportError?人们总是无所适从,总是向SO寻求帮助。 :)(在不需要的情况下进行sys.modules查找并将所有字符串转换为int等,这显然也会降低性能,但是我怀疑这会很重要。)

因此,我认为我的写法是:
try:
    from shlex import quote as cmd_quote
except ImportError:
    from pipes import quote as cmd_quote

关于python - Python 3向后兼容性(shlex.quote与pipes.quote),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26790916/

10-14 05:37