Python 3向后兼容性(shlex.quote vs pipes.quote)

时间:2014-11-06 22:49:13

标签: python compatibility shlex

我的一个项目使用自{em> python 3.3 以来可用的shlex.quote。但shlex.quotepipes.quote相同,后者在移至shlex后已弃用。

现在为兼容性而我正在使用此代码:

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)

是否存在更好的做法?

1 个答案:

答案 0 :(得分:11)

首先,如果您想对版本进行数值比较,请使用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查看所有这些内容并将字符串转换为整数时,显然有点性能打击,等等,当你不需要时,但我怀疑#&# 39;重要的是。)


所以,我认为我写它的方式是:

try:
    from shlex import quote as cmd_quote
except ImportError:
    from pipes import quote as cmd_quote